在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中的包级别打印构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

类构造函数中的ES6解构[重复]

getClass() 在枚举中使用构造函数时打印二进制格式 [重复]

RemoteViews 构造函数中的包名称是啥?

为啥Java反射在另一个包中找不到一个类的包私有构造函数?

Java 构造函数具有比其类更广泛的访问级别

在Java泛型类中,在构造函数级别添加额外的通用约束?