1.jdk动态代理只能代理实现了接口的类,没有实现接口的类不能实现jdk的动态代理
2.cglib是针对类来实现代理的,对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用
被代理类
public class Train {
public void move(){
System.out.println("开始行驶");
System.out.println("正在行驶");
}
}
public class TrainProxy implements MethodInterceptor {
//Enhancer允许为非接口类型创建一个Java代理。
//Enhancer动态创建了给定类型的子类但是拦截了所有的方法。
//和Proxy不一样的是,不管是接口还是类他都能正常工作。
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class class1) {
//设置创建子类的类
enhancer.setSuperclass(class1);
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 作用:拦截所有目标类方法的调用 arg0目标类的实例 arg1目标方法的反射对象 arg2 方法的参数 arg3 代理类的实例
*/
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("打印日志");
arg3.invokeSuper(arg0, arg2);
return null;
}
}
测试类
public class CglibTest {
public static void main(String [] args){
TrainProxy trainProxy=new TrainProxy();
//创建代理类对象
Train t=(Train)trainProxy.getProxy(Train.class);
t.move();
}
}