【问题标题】:Java Reflection: get instances of a given class found by entering its name?Java反射:通过输入名称获取给定类的实例?
【发布时间】:2011-02-21 15:46:03
【问题描述】:

是否可以通过输入该类的名称作为字符串来获取该类的所有实例?

这样的?

var instances = Reflection.findClass("com.someone.MyClass").getInstances();

感谢任何反馈。谢谢。

【问题讨论】:

  • 类似问题:“使用 Java 反射,是否可以获取局部变量的名称?” stackoverflow.com/questions/744226/…
  • 如果你想知道一个类在运行时存在多少个实例,将引用保存在成员变量中会给你访问权限。

标签: java oop class reflection instance


【解决方案1】:

不,没有类似的东西可用。如果您连接到调试 API,您也许可以这样做,但在“正常”运行时不行。

【讨论】:

    【解决方案2】:

    我不知道在运行时执行此操作的方法,但是,如果您愿意“离线”执行此操作,您可以执行以下操作:

    1. 进行堆转储
    2. 将堆转储加载到Eclipse MAT
    3. 打开 OQL 窗格,然后输入命令,例如 select * from com.someone.MyClass。运行此查询将返回进行堆转储时内存中的实例。

    【讨论】:

      【解决方案3】:

      这是分析器擅长的事情。使用 YourKit,您可以根据通配符类搜索实例,并从最大到最小或其他排序标准检查/导航到它们。

      【讨论】:

        【解决方案4】:

        This answer 提供了一些使用各种检测 API 的选项。但这些通常适用于在单独 JVM 中运行的应用程序,它们需要停止 JVM 并遍历堆中的所有对象以查找相关实例。


        JVM 不会保留每个类的所有实例的任何内部集合。但是你可以自己做这种事情......如果你在你感兴趣的每个特定类或类中实现行为。你只需要小心避免通过保留对实例的引用来避免造成内存泄漏,否则可收集的垃圾。

        【讨论】:

          【解决方案5】:

          这里的问题是找不到类对象(这可以通过Class.forName() 完成),但通常一个类不知道它的实例。

          如果您可以控制您的类,您可以创建所有实例的注册表,并将每个实例添加到构造函数中。但是你应该注意不要通过这个来禁用垃圾收集,所以使用弱引用而不是普通引用。

          【讨论】:

            猜你喜欢
            • 2020-05-12
            • 1970-01-01
            • 1970-01-01
            • 2011-01-03
            • 1970-01-01
            • 2014-06-22
            • 2014-06-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多