文章目录
1 总结
-
JDK动态代理
-
要求委托类必须实现接口,根据接口动态生成代理对象的字节码文件;
-
关键类及方法:InvocationHandler(invoke)、Proxy(newProxyInstance)
-
生成的代理类会实现委托类所实现的接口,并且在实现接口中的相应方法;
-
这些相应方法会使用
super.h.invoke()
方法,去调用invoketionHandler
的实现类中重写的invoke()
方法;
-
-
CGLIB动态代理
-
要求委托类能够被继承(委托类不能被
final
修饰) -
关键类及方法:MethoInterceoptor(intercept()(invokeSuper) )、Enhancer(setSuprClass()、setCallBack()、create())
-
生成的代理类会去继承委托类,并重写委托类的方法, 即以继承的方式去获取委托类的方法;
-
代理类调用某方法时,该方法内会调用MethodInterceptor的实现类重写的intercept()方法;
-
2 代码实现
2.1 接口与其实现类代码
// 接口
public interface MyInterface {
void myMethod1(String sentence);
void myMethod2(String sentence);
}
// 接口实现类
public class MyInterfaceImpl implements MyInterface{
@Override
public void myMethod1(String sentence) {
System.out.println("方法一运行,打印sentence: " + sentence);
}
@Override
public void myMethod2(String sentence) {
System.out.println("方法二运行,打印sentence: " + sentence);
}
}
2.2 静态代理代码实现
public class MyStaticProxy implements MyInterface{
MyInterface myInterface;
public MyStaticProxy(MyInterface myInterface){
this.myInterface = myInterface;
}
@Override
public void myMethod1(String sentence) {
System.out.println("myMethod1的Before增强方法运行");
myInterface.myMethod1(sentence);
System.out.println("myMethod1的After增强方法运行");
}
@Override
public void myMethod2(String sentence) {
System.out.println("myMethod2的Before增强方法运行");
myInterface.myMethod2(sentence);
System.out.println("myMethod2的After增强方法运行");
}
}
2.3 JDK动态代理实现InvocationHandler接口
public class MyInvokeHandlerImpl<T> implements InvocationHandler {
T t;
public MyInvokeHandlerImpl(T t){
this.t = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("myMethod1")){
System.out.println("myMethod1的Before增强方法运行");
method.invoke(t, args);
System.out.println("myMethod1的After增强方法运行");
}else if (method.getName().equals("myMethod2")){
System.out.println("myMethod2的Before增强方法运行");
method.invoke(t, args);
System.out.println("myMethod2的After增强方法运行");
}
return "JDK代理运行完成";
}
}
2.4 CGLIB动态代理实现MethodInterceptor接口
public class MyMethodInterceptorImpl implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
if (method.getName().equals("myMethod1")){
System.out.println("myMethod1的Before增强方法运行");
methodProxy.invokeSuper(o, objects);
System.out.println("myMethod1的After增强方法运行");
}else if (method.getName().equals("myMethod2")){
System.out.println("myMethod2的Before增强方法运行");
methodProxy.invokeSuper(o, objects);
System.out.println("myMethod2的After增强方法运行");
}
return "CGLIB代理运行完成";
}
}
2.5 运行结果
1 main方法
public class test {
public static void main(String[] args) {
MyInterface myInterfaceImpl = new MyInterfaceImpl();
System.out.println("*******************静态代理*******************");
MyStaticProxy myStaticProxy = new MyStaticProxy(myInterfaceImpl);
myStaticProxy.myMethod1("静态代理");
myStaticProxy.myMethod2("静态代理");
System.out.println("*******************JDK动态代理*******************");
MyInvokeHandlerImpl<MyInterface> myInvokeHandlerImpl = new MyInvokeHandlerImpl<MyInterface>(myInterfaceImpl);
MyInterface o = (MyInterface)Proxy.newProxyInstance(MyInterface.class.getClassLoader(), new Class[]{MyInterface.class}, myInvokeHandlerImpl);
o.myMethod1("JDK动态代理");
o.myMethod2("JDK动态代理");
System.out.println("*******************CGLIB动态代理*******************");
MyMethodInterceptorImpl myMethodInterceptor = new MyMethodInterceptorImpl();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyInterfaceImpl.class);
enhancer.setCallback(myMethodInterceptor);
MyInterfaceImpl o1 = (MyInterfaceImpl) enhancer.create();
o1.myMethod1("CGLib动态代理");
o1.myMethod2("CGLib动态代理");
}
}
2 运行结果
************静态代理 ************
myMethod1的Before增强方法运行
方法一运行,打印sentence: 静态代理
myMethod1的After增强方法运行
myMethod2的Before增强方法运行
方法二运行,打印sentence: 静态代理
myMethod2的After增强方法运行
*********JDK动态代理 *********
myMethod1的Before增强方法运行
方法一运行,打印sentence: JDK动态代理
myMethod1的After增强方法运行
myMethod2的Before增强方法运行
方法二运行,打印sentence: JDK动态代理
myMethod2的After增强方法运行
************CGLIB动态代理 ************
myMethod1的Before增强方法运行
方法一运行,打印sentence: CGLib动态代理
myMethod1的After增强方法运行
myMethod2的Before增强方法运行
方法二运行,打印sentence: CGLib动态代理
myMethod2的After增强方法运行