概念
代理是一种设计模式。使用代理对象替换真实对象,实现不修改真实对象的前提下对其进行额外操作,对其进行扩展。spring中的aop就是使用代理实现的。
静态代理
静态代理中的 真实对象和代理对象都需要实现同一个接口。对真实对象每个方法进行单独增强。
创建接口
public interface Action {
void doSomething(String param);
}
创建代理类
public class StaticProxy implements Action {
private Action object;
public StaticProxy(Action object) {
this.object = object;
}
@Override
public void doSomething(String param) {
System.out.println("before");
object.doSomething(param);
System.out.println("after");
}
}
创建普通类
public class App implements Action {
@Override
public void doSomething(String param) {
System.out.println(param);
}
public static void main(String[] args) {
//创建代理对象
StaticProxy proxy = new StaticProxy(new App());
proxy.doSomething("hi");
}
}
// 执行结果
/* before
hi
after */
JDK动态代理
与静态代理相比,JDK动态代理更加灵活。它的核心是 InvocationHandler接口和 Proxy类。使用Proxy类的newProxyInstance方法获取实例,newProxyInstance的三个参数分别是类加载器,被代理类实现的接口和实现InvocationHandler的代理类。JDK动态代理只能代理实现了接口的类。
创建接口
public interface Action {
void doSomething(String param);
}
创建代理类
public class JDKProxy implements InvocationHandler {
//要代理的对象
private Object object;
public JDKProxy(Object object) {
this.object = object;
}
//获取实例
public static Object getInstance(Object object) {
JDKProxy handler = new JDKProxy(object);
Object instance = Proxy.newProxyInstance(
object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
handler);
return instance;
}
//执行目标方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object invoke = method.invoke(object, args);
System.out.println("after");
return invoke;
}
}
创建普通类
public class App implements Action {
@Override
public void doSomething(String param) {
System.out.println(param);
}
public static void main(String[] args) {
Action action = (Action) JDKProxy.getInstance(new App());
action.doSomething("hi");
}
}
// 执行结果
/* before
hi
after */
CGLIB动态代理
与JDK动态代理相比,CGLIB动态代理可以直接代理类,类不需要实现接口。CGLIB动态代理的核心是 MethodInterceptor接口与 Enhancer类。CGLIB动态代理需要引入依赖。
创建代理类
public class CGLibProxy implements MethodInterceptor {
public static Object getInstance(Class clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setClassLoader(clazz.getClassLoader());
enhancer.setSuperclass(clazz);
enhancer.setCallback(new CGLibProxy());
Object result = enhancer.create();
return result;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("after");
return result;
}
}
创建普通类
public class App {
public void doSomething(String param) {
System.out.println(param);
}
public static void main(String[] args) {
App app = (App) CGLibProxy.getInstance(App.class);
app.doSomething("hi");
}
}
// 打印结果
/* before
hi
after */
Original: https://blog.csdn.net/weixin_46899412/article/details/128749234
Author: AGi_
Title: 仿写Dubbo-Java代理
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/812979/
转载文章受原作者版权保护。转载请注明原作者出处!