Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java反射:通过输入给定类的名称来获取该类的实例?_Java_Oop_Class_Reflection_Instance - Fatal编程技术网

Java反射:通过输入给定类的名称来获取该类的实例?

Java反射:通过输入给定类的名称来获取该类的实例?,java,oop,class,reflection,instance,Java,Oop,Class,Reflection,Instance,是否可以通过以字符串形式输入该类的名称来获取该类的所有实例 像这样的 var instances = Reflection.findClass("com.someone.MyClass").getInstances(); 任何反馈都将不胜感激。谢谢。不,没有这样的。如果您连接到调试API中,您可能可以执行此操作,但在“正常”运行时无法执行此操作。我不知道在运行时执行此操作的方法,但是,如果您愿意“脱机”执行此操作,您可以执行以下操作: 大吃一惊 将堆转储加载到 打开OQL窗格,输入命令,如se

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

像这样的

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

任何反馈都将不胜感激。谢谢。

不,没有这样的。如果您连接到调试API中,您可能可以执行此操作,但在“正常”运行时无法执行此操作。

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

  • 大吃一惊
  • 将堆转储加载到
  • 打开OQL窗格,输入命令,如
    select*from com.someone.MyClass
    。运行此查询将返回执行堆转储时内存中的实例
  • 提供了一些使用各种检测API的选项。但是这些通常在运行在单独JVM中的应用程序上工作,它们需要停止JVM并遍历堆中的所有对象以找到相关实例



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

    这里的问题是找不到类对象(这可以通过
    class.forName()
    )来完成),但通常类不知道其实例


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

    这是探查器所擅长的。使用YourKit,您可以搜索基于通配符类的实例,并从最大到最小或其他排序条件检查/导航到它们。

    类似的问题:“使用Java反射,是否可以获取局部变量的名称?”如果您想知道一个类在运行时有多少个实例,在成员变量中保存引用将授予u访问权限。