java 动态代理,
java 动态代理,
概述:
在现实社会中,租房子,找房产中介;打官司,找律师所。其中这些房产中介,和律师所就是我们的代理,在交易或对垒中,我们不直接和房东和法院打交道,而是由我们的代理去直接和他们去沟通和协调,行使我们的职责。
代理模式:
java中代理设计模式的概念和现实社会中代理概念类似,java中的代理类,可以类比为房产中介,和律师所。
代理类图如下:
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
典型应用:面向切面(aop)为某些系统加入,日志记录,权限检测,以及app埋点记录,和动态注入点击事件。
静态代理:
package prox;
public interface ISubject {
public void doSomething();
}
package prox;
public class RealSubject implements ISubject {
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("realSubjct...");
}
}
package prox;
public class ProxySubject implements ISubject {
ISubject realObject= new RealSubject();
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("proxy代理befor.....");
realObject.doSomething();
System.out.println("proxy代理after.....");
}
}
执行结果:
注意:静态代理实现中,一个委托类对应一个代理类,代理类在编译期间就已经确定。
动态代理:
jdk反射实现动态代理:
package prox;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("Dynimac代理 befor...");
Object result = method.invoke(target, args);
System.out.println("Dynimac代理 after...");
return result;
}
}
public static void main(String[] args) {
// ISubject proxy = new ProxySubject();
// proxy.doSomething();
Object object = new RealSubject();
DynamicProxy target = new DynamicProxy(object);//生成目标对象
//接下来创建代理对象
ISubject proxy = (ISubject) Proxy.newProxyInstance(
object.getClass().getClassLoader(),
object.getClass().getInterfaces(), target);
proxy.doSomething();
}
原理简述:运行时,根据传入的接口,生成实现该接口代理类字节码,通过传入的classLoader加载字节码,通过反射,生成代理类对象。调用代理类的实现接口的方法时候,代理类对象内部,调用InvocationHandler invok方法。invoke方法,加入自己的控制逻辑,内部再通过反射,调用真正类的方法。
注意:由jdk动态代理原理可知,使用JDK动态代理,目标类必须实现的某个接口,如果某个类没有实现接口则不能生成代理对象。此外可通过使用CGLIB实现动态代理,且目标类不需要实现某个接口,在此不对cGlib做更多介绍。
,希望对您有所帮助!
相关文章
- 暂无相关文章
用户点评