我在另一个罐子里有A类,我在B豆中使用它。 现在我想在 A 类中添加方法的日志。如何在不修复 jar 的情况下在我的项目中执行此操作。
我的想法:
-
使用 ApplicationListener 在 Bean 初始化之前重新定义类。
-
在 onApplicationEvent(( 中做一些事情来重新定义 A 类。 这是我的问题。
我知道可以使用asm或其他工具来修复字节码。我看到了仪器,但没有找到解决方案。https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html
如何在 Java 中获取检测实例
一类。
public class A {
public void find(){
System.out.println("aaa");
//i want to add log here.
}
B豆
@Service public class B {
public A get(){
return new A();
}
应用程序侦听器
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if(event.getApplicationContext().getParent() != null){
return;
}
// redefine class
}
然后当我使用 b.get((.find(( 时,它将打印我添加的日志。
找到我的解决方案。 使用 javassist 修改类并提前加载它(使用 CtClass.toClass(((。 https://www.javassist.org/tutorial/tutorial.html