你好,stackoverflow社区,
我最近发现了java工具以及可以用它做什么伟大的事情,所以我决定为自己编写一个小的库来简化这些事情。
我有以下方法(简化):
public static void editClass(Class<*> clazz) {
...
}
它通过工具添加了一个转换器,该工具转换名为的已加载类的字节码 clazz.getName()
.
所以在我的premain方法中,我可以说
editClass(Foo.class);
我的问题是,通过对类(.class)的引用来指定类,这个类在添加转换器之前被加载,所以在添加转换器之后,我必须重新转换这个类,这会阻止我添加/删除方法等等。
那么,在使用这个类引用时有没有办法不加载类呢?或者其他的方法来实现这个?我知道我可以把类名作为参数传递,但我真的很想让整个库类型安全,让重构更容易。
提前谢谢!
1条答案
按热度按时间ztyzrc3y1#
如果你想打电话给
editClass
方法来自premain
我们假设java代理本身不使用该类,因此editClass
调用将是唯一的触发器,您可以执行以下操作:提供两种方法,
editClass(Class<?> clazz)
以及editClass(String qualifiedName)
写下premain
方法(或一般的代理类)使用editClass(Class<?>)
并且在通过文本引用的类的存在方面享受编译时安全执行代理类的静态代码转换,替换
editClass(Class<?>)
与editClass(String)
这应该不会太难,因为您只需要替换ldc packagename/Foo.class
,invokestatic (Ljava/lang/Class;)V
与ldc "packagename.Foo"
,invokestatic (Ljava/lang/String;)V
.当这种方法
editClass(String qualifiedName)
可以处理内部类名(使用斜杠而不是点)。既然您说您“最近发现了java工具”,这可能是一个很好的类文件转换练习
使用已转换的代理类(不再引用要转换的类)执行加载时转换