Java 如何使用ASM库从库中识别重写的方法?
我正在使用ASM收集关于Android项目中类的一些信息(使用gradle插件和Google Transform API相结合)。我想知道一个方法是否正在重写其超类/接口中的一个方法。如果超类或接口是项目或本地依赖项(JAR)的一部分,我可以将当前方法的描述符与超类/接口中定义的所有方法进行比较。这是通过遍历整个层次结构(自底向上)完成的。如果我在描述符之间找到匹配项,我就找到了一个重写的方法 当我到达标准库中定义的超类/接口(如Java 如何使用ASM库从库中识别重写的方法?,java,android,bytecode,java-bytecode-asm,bytecode-manipulation,Java,Android,Bytecode,Java Bytecode Asm,Bytecode Manipulation,我正在使用ASM收集关于Android项目中类的一些信息(使用gradle插件和Google Transform API相结合)。我想知道一个方法是否正在重写其超类/接口中的一个方法。如果超类或接口是项目或本地依赖项(JAR)的一部分,我可以将当前方法的描述符与超类/接口中定义的所有方法进行比较。这是通过遍历整个层次结构(自底向上)完成的。如果我在描述符之间找到匹配项,我就找到了一个重写的方法 当我到达标准库中定义的超类/接口(如java.lang或android.app等)时,我的问题就会出现
java.lang
或android.app
等)时,我的问题就会出现,因为我不知道如何访问此类类。如果库类位于当前类路径中,我可以直接从ClassReader
访问
例如:
ClassReader classReader = new ClassReader("java.lang.Object");
但是如果类不在当前的类路径中,我会(当然)得到java.io.IOException:class not found
。例如,当我尝试:
ClassReader classReader = new ClassReader("android.app.Activity");
据我所知,比较两个方法的描述符是确定一个方法是否重写另一个方法的唯一方法,因此我必须以某种方式访问超类/接口
所以我的问题是:
如何访问标准库中定义的超类/接口?
(注意:不是android项目内部的依赖项,我已经能够对其进行评估),或者如果有另一种方法来确定覆盖属性如果您将标准库作为jar,那么您可以使用InputStream创建一个类读取器。问题正是这样。在android项目的构建过程中,我没有标准库作为jar,我可以访问项目源代码、依赖项、子项目以及TransformAPI允许查看的所有内容。但是我不能访问stdlib类必须是一种格式,编译器可以读取,即在目录或jar文件中,否则,就不可能编译项目。如果您将标准库作为jar,那么您可以使用InputStream创建一个类读取器。问题正是这样。在android项目的构建过程中,我没有标准库作为jar,我可以访问项目源代码、依赖项、子项目以及TransformAPI允许查看的所有内容。但是我不能访问stdlib类必须是编译器可以读取的格式,即在目录或jar文件中,否则,就不可能编译项目。