Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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_Class_Bytecode_Collect - Fatal编程技术网

Java从字节码中收集所有使用过的类

Java从字节码中收集所有使用过的类,java,class,bytecode,collect,Java,Class,Bytecode,Collect,我试图实现一个RemoteClassLoader,它复制并加载运行时将使用的所有类。首先,我需要收集使用过的类,我找到了一个解决方案: 但这并不完全是需要的,它只收集可见的类用法,就像加载类并迭代所有声明的字段和方法,以及收集所有类型一样。 我有一个只包含静态方法的类,这个方法的实例并没有被使用,所以它永远不会被赋予一个函数或者是一个文件,所以我看不到那个类 字节码文件自然包含此类的名称: strings TestClass.class | grep -i "json" gives: org/

我试图实现一个RemoteClassLoader,它复制并加载运行时将使用的所有类。首先,我需要收集使用过的类,我找到了一个解决方案:

但这并不完全是需要的,它只收集可见的类用法,就像加载类并迭代所有声明的字段和方法,以及收集所有类型一样。 我有一个只包含静态方法的类,这个方法的实例并没有被使用,所以它永远不会被赋予一个函数或者是一个文件,所以我看不到那个类

字节码文件自然包含此类的名称:

strings TestClass.class | grep -i "json"

gives: org/json/JSONObject
是的,那门课我不喜欢。
我怎样才能找到它?还有其他我只在函数中使用的方法。

最简单但保守的方法是从常量池中获取所有Class_info条目。为了调用一个方法或访问一个类的字段,该类必须有一个常量池条目,不计算子类中的反射和重写方法

有很多工具可以解析一个类文件,并允许您访问它。当然,反思要困难得多,而且通常是不确定的


编辑:这不包括类型描述符,它们只是Utf8\U信息。如果您想找到用作类型的类,有两种方法。您可以遍历所有UTF8并包含看起来像描述符的所有内容,这些描述符在极少数情况下可能会出现误报,也可以遍历类文件并找到所有类型描述符引用。

我知道通过reflect使用的类将不会显示。