java插装:防止类引用加载类

5t7ly7z5  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(365)

你好,stackoverflow社区,
我最近发现了java工具以及可以用它做什么伟大的事情,所以我决定为自己编写一个小的库来简化这些事情。
我有以下方法(简化):

public static void editClass(Class<*> clazz) {
   ...
}

它通过工具添加了一个转换器,该工具转换名为的已加载类的字节码 clazz.getName() .
所以在我的premain方法中,我可以说

editClass(Foo.class);

我的问题是,通过对类(.class)的引用来指定类,这个类在添加转换器之前被加载,所以在添加转换器之后,我必须重新转换这个类,这会阻止我添加/删除方法等等。
那么,在使用这个类引用时有没有办法不加载类呢?或者其他的方法来实现这个?我知道我可以把类名作为参数传递,但我真的很想让整个库类型安全,让重构更容易。
提前谢谢!

ztyzrc3y

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;)Vldc "packagename.Foo" , invokestatic (Ljava/lang/String;)V .
当这种方法 editClass(String qualifiedName) 可以处理内部类名(使用斜杠而不是点)。
既然您说您“最近发现了java工具”,这可能是一个很好的类文件转换练习
使用已转换的代理类(不再引用要转换的类)执行加载时转换

相关问题