文章目录
- Byte Buddy 是一个字节码生成与操作库。它无需编译器,能够在Java程序运行时创建与修改 class 文件。
- 已有类文件: public static class Log { public static void log(String a) { System.out.println("Log: " + a); } } 目标是将所有 Log 类中对 log 方法的调用全转到 log4j 上。
- 修改 pom.xml 添加依赖: <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy-agent</artifactId> <version>1.8.0</version> </dependency>
- ByteBuddyAgent.install(); new ByteBuddy().redefine(Log.class) .method(ElementMatchers.named("log")) .intercept(MethodDelegation.to(Log4j.class)) .make() .load(Thread.currentThread().getContextClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); 重新定义的实现类如下: public static class Log4j { public static void log(String a) { System.err.println("Log4j: " + a); } } 注意代理类要和原实现类的方法声明保持一致
- 此时就会发现所有对 Log 方法的调用就全转到 新类上了。
Byte Buddy 是一个字节码生成与操作库。它无需编译器,能够在Java程序运行时创建与修改 class 文件。
已有类文件:
public static class Log {
public static void log(String a) {
System.out.println("Log: " + a);
}
}
目标是将所有 Log 类中对 log 方法的调用全转到 log4j 上。
修改 pom.xml 添加依赖:
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-agent</artifactId>
<version>1.8.0</version>
</dependency>
ByteBuddyAgent.install();
new ByteBuddy().redefine(Log.class)
.method(ElementMatchers.named("log"))
.intercept(MethodDelegation.to(Log4j.class))
.make()
.load(Thread.currentThread().getContextClassLoader(), ClassReloadingStrategy.fromInstalledAgent());
ByteBuddyAgent.install();
new ByteBuddy().redefine(Log.class)
.method(ElementMatchers.named("log"))
.intercept(MethodDelegation.to(Log4j.class))
.make()
.load(Thread.currentThread().getContextClassLoader(), ClassReloadingStrategy.fromInstalledAgent());
重新定义的实现类如下:
public static class Log4j {
public static void log(String a) {
System.err.println("Log4j: " + a);
}
}
注意代理类要和原实现类的方法声明保持一致
此时就会发现所有对 Log 方法的调用就全转到 新类上了。
发表回复