在Java中的包级别打印构造函数[重复]
Posted
技术标签:
【中文标题】在Java中的包级别打印构造函数[重复]【英文标题】:Print constructors at package level in Java [duplicate] 【发布时间】:2017-11-29 21:45:28 【问题描述】:我有这个要求。
一个包中有很多类。每个类都有构造函数。我想打印出该包中这些类的所有构造函数。
注意:我检查了反射,它允许在类级别打印任何类的构造函数名称。
try
Constructor<?>[] publicConstructors = Class.forName("class_name").getConstructors();
System.out.println(Arrays.toString(publicConstructors));
catch (ClassNotFoundException e)
e.printStackTrace();
但我想在包级别打印所有构造函数。
这可能吗?请帮忙。
【问题讨论】:
我认为您必须先在包中找到类,然后再加载/查找构造函数。除非您编写自己的类加载器,否则前者是不可能的。 既然你似乎知道如何找到一个类的构造函数,看来你的问题实际上是关于如何找到一个包的类,所以作为Can you find all classes in a package using reflection? 的副本关闭——你做知道如何嵌套两个循环来获取所有的构造函数吧? 【参考方案1】:不幸的是,您不能只在 vanilla java 中的包中“搜索”类(在任何合理的意义上)。您使用反射有正确的想法,您可以尝试使用org.reflections
库
Set<Class<? extends Object>> classesInPackage =
new Reflections("package.path").getSubTypesOf(Object.class);
这个第三方库允许您搜索现有的类路径。一旦你有了这组类,你就可以使用普通的反射来获取它的构造函数,然后用它做你想做的事情。
【讨论】:
【参考方案2】:您必须改用.getDeclaredConstructors()
。
try
Constructor<?>[] constructors = Class.forName("class_name").getDeclaredConstructors();
System.out.println(Arrays.toString(constructors));
catch (Exception e)
e.printStackTrace();
打印
[st.Construct(java.lang.String), public st.Construct(int), st.Construct()]
【讨论】:
【参考方案3】:开源反射库:https://github.com/ronmamo/reflections
需要先通过Reflection设置索引:
List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("org.your.package"))));
然后你可以在包中执行查询:
Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);
【讨论】:
以上是关于在Java中的包级别打印构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章