【问题标题】:Is there a Java equivalent to PHP's get_declared_classes()?是否有与 PHP 的 get_declared_classes() 等效的 Java?
【发布时间】:2015-01-18 03:09:13
【问题描述】:

我正在寻找一种在 Java 中打印所有实例化对象的方法。使用 get_declared_classes() 的 PHP 有一个简单的方法:

<?php
print_r(get_declared_classes());
?>

在 Java 中是否有与 PHP 一样简单的等价物?

【问题讨论】:

  • @user3122479 他需要完整列表
  • 另一种方法是在实例化它们时跟踪它们
  • 这是一个有趣的要求。我认为在 Java 中没有很好的方法来做到这一点。老实说,我什至不认为 PHP 版本在其实现方面能很好地工作——它会遗漏一些东西。如果您只关心某些对象,我会按照 Shailendra Sharma 的建议进行操作,并在制作它们时跟踪它们。否则我不会相信任何代码在不付出大量努力的情况下就能可靠地做到这一点。

标签: java php class object instantiation


【解决方案1】:

在 Java 中加载类是通过类加载器完成的,因此您只能希望通过给定的类加载器加载所有类。请注意,一个类可能被不同的类加载器加载,甚至可以被不同的类加载器加载到不同的版本中。

如果您想了解单个类加载器加载了哪些类,请查看How can I list all classes loaded in a specific class loader

一个简单的解决方案可能是

Field f = ClassLoader.class.getDeclaredField("classes");
f.setAccessible(true);

Vector<Class> classes =  (Vector<Class>) f.get(classLoader);

但这取决于 Suns 的实施,并且可能会在其他供应商中失败。

【讨论】:

    【解决方案2】:

    我自己做了一些研究,发现为了调试目的,最简单的方法是使用命令行选项-verbose:class 启动 JVM,如下所示:

    java -verbose:class Example
    

    它将列出所有实例化的类,这对我有用。无论如何感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      相关资源
      最近更新 更多