请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

老师好,是这样的:

我有一个 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

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

正在回答 回答被采纳积分+3

1回答

allenfeng 2021-08-23 16:49:48

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

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


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



0 回复 有任何疑惑可以回复我~
  • 提问者 xxxxjase #1
    为啥 classLoader 不行呢。。?
    回复 有任何疑惑可以回复我~ 2021-08-23 17:02:53
  • 提问者 xxxxjase #2
    估计是对那个目录没有 read write 权限。。
    回复 有任何疑惑可以回复我~ 2021-08-23 17:36:45
  • allenfeng 回复 提问者 xxxxjase #3
    若感兴趣ClassLoader的方案,建议进一步分析GroovyClassLoader的源码,分析addClasspath方法是否调用成功,调用后其内部逻辑如何运作、loadClass执行流程等。
    回复 有任何疑惑可以回复我~ 2021-08-23 17:49:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信