Java cglib 动态代理机制
上一篇讲过Java 的jdk动态代理机制 https://blog.csdn.net/k_young1997/article/details/91975889
它只能动态代理实现接口的类,如果没有实现接口,jdk是无法代理的。如果要实现类的动态代理可以使用cglib。
cglib 是一个强大的, 高效高质的代码生成库。
1、定义一个Programmer类
package demo;
public class Programmer {
public void code() {
System.out.println("I'm a Programmer,Just Coding.....");
}
}
2、定义一个Hacker类,实现方法拦截器接口
package demo;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class Hacker implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
//在方法调用之前,加入自己的代码
System.out.println("**** I am a hacker,Let's see what the poor programmer is doing Now...");
//调用代理的方法
proxy.invokeSuper(obj, args);
//在方法调用之后,加入自己的代码
System.out.println("**** Oh,what a poor programmer.....");
return null;
}
}
3、生成动态代理对象,调用方法
package demo;
import net.sf.cglib.proxy.Enhancer;
public class Test {
public static void main(String[] args) {
Hacker hacker = new Hacker();
//cglib 中 用来创建动态代理
Enhancer enhancer = new Enhancer();
//设置要创建动态代理的类
enhancer.setSuperclass(Programmer.class);
// 设置回调,对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实行intercept()方法进行拦截
enhancer.setCallback(hacker);
Programmer p = (Programmer) enhancer.create();
p.code();
}
}
cglib不仅能动态代理类,也可以动态代理接口,只需将 enhancer.setSuperclass()
换为 enhancer.setInterfaces(new Class[] {Interfaces.class});
。 其中 new Class[] {} 为接口class对象的数组,在MethodInterceptor
中根据自己的需要添加代码即可。
还没有评论,来说两句吧...