关于 transform 中操作 class 字节码的问题

来源:11-2 技能拓展

xxxxjase普通

2021-08-22

老师好,是这样的:

我有一个 class 文件生成到了如下目录(app 是主模块)
/app/build/intermediates/javac/debug/classes/com/cool/AppApplication.class

@CoolTest(
    main = true
)
public class AppApplication extends Application {
    public AppApplication() {
    }

AppApplication 有个注解。

我现在想在 transform 中去加载这个类,判断是否被注解修饰,以及 main 的取值,然后进一步处理,但是我发现都报错了:

  • 使用 GroovyClassLoader,提示找不到类异常;
GroovyClassLoader groovyClassLoader = new GroovyClassLoader()
// file.absolutePath : /app/build/intermediates/javac/debug/classes/com/cool/AppApplication.class
groovyClassLoader.addClasspath(file.absolutePath)
Class currentClass = groovyClassLoader.loadClass("com.cool.AppApplication") // class


> java.lang.ClassNotFoundException: com.cool.AppApplication

想问下我该怎么弄呢???

写回答

1回答

allenfeng

2021-08-23

你好,需求是“transform 中去加载这个类,判断是否被注解修饰,以及 main 的取值,然后进一步处理”:

类的注解信息以及注解的取值都在字节码中,所以一般是采用ASM中ClassReader去读取与解析对应字节码,即可满足你的要求。


可以参考这个链接去撰写相关代码,也可以搜索更多类似的例子。



0
6
xxxxjase普通
回复
allenfeng
好难哦,这个问题我找了好久,都没有答案。ClassReader 的方案也没有效果
2021-08-23
共6条回复

Android 应用程序构建实战+原理精讲

深度掌握 Gradle 使用,系统性学习 Android 应用构建知识

450 学习 · 116 问题

查看课程