JDK动态代理
1.先写一个自己的JDKProxy代理类,实现InvocationHandler
/**
* JDK 动态代理类
*
* @author yeleichao
* @date 2018-3-30.
*/
public class JDKProxy implements InvocationHandler {
private Object target;//传入被代理类的引用
public Object getInstance(Object target){
this.target = target;
Class<?> clazz = target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),
clazz.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理,进行业务操作");
return method.invoke(target, args);
}
}
2.写一个被代理的类
/**
* 被代理类
*
* @author yeleichao
* @date 2018-3-30.
*/
public class Yeleichao implements IYeleichao {
@Override
public void hello() {
System.out.println("hello JAVA Proxy!");
}
}
/**
* 接口
*
* @author yeleichao
* @date 2018-3-30.
*/
public interface IYeleichao {
void hello();
}
3.测试类进行测试
/**
* 测试jdk 动态代理
*
* @author yeleichao
* @date 2018-3-30.
*/
public class TestJDKProxy {
public static void main(String[] args) {
Yeleichao yeleichao = new Yeleichao();
IYeleichao iYeleichao = (IYeleichao) new JDKProxy().getInstance(yeleichao);
iYeleichao.hello();
}
}
4.结果展示
CGLIB代理
1.实现cglib代理前需要引入2个jar包
2.cglib代理类
/**
* cglib 动态代理类
*
* @author yeleichao
* @date 2018-3-30.
*/
public class CglibProxy implements MethodInterceptor {
public Object getInstance(Class<?> clazz) throws Exception {
Enhancer enhancer = new Enhancer(); //要把哪个设置为即将生成的新类父类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib proxy,进行业务操作");
return methodProxy.invokeSuper(o, objects);
}
}
3.cglib测试类
/**
* cglib 测试类
*
* @author yeleichao
* @date 2018-3-30.
*/
public class CglibTest {
public static void main(String[] args) throws Exception {
Yeleichao yeleichao = (Yeleichao) new CglibProxy().getInstance(Yeleichao.class);
yeleichao.hello();
}
}
4.执行结果
结论:JDK动态代理需要实现接口,而CGLIB不需要实现接口