面试被问到一次:动态代理的实现方式
基于接口-----JDK动态代理
基于类-------cglib
java字节码实现: javalist
复制代码
需要重点了解的两个类 Proxy, InvocationHandler
proxy:提供创建动态代理类和实例的静态方法,由着些方法创建所有的动态代理类的超类!
与静态代理不同的是没有实际的代理对象;有一些固定的反射步骤来进行处理获得想要的结果
这一种根据代码中被代理的对象是接口,就知道是jkd动态代理
整个事情的任务--->就是为了打游戏!!!!!!!!!!!!!!!!
public interface Dayouxi {
public void play();
}
复制代码
复制代码
我的任务,变得很简练
public class Wo implements Dayouxi{
@Override
public void play() {
System.out.println("铂金到钻石!");
}
}
复制代码
public class ProxyInvocationHand implements InvocationHandler {
//被代理的接口
private Dayouxi dyx;
public void setWo(Dayouxi dyx){
this.dyx=dyx;
}
//得到代理类
public Object getProxy(){
/*几个参数
1.类加载器,通过反射获得
2.接口, 反射获得
3.InvocationHandler ,因为这个类继承了InvocationHandler,所以直接调用这个类就可以了。
*/
return Proxy.newProxyInstance(this.getClass().getClassLoader(), dyx.getClass().getInterfaces(),this);
}
//处理代理实类,并且返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理的本质是:反射机制实现!!
Object result = method.invoke(dyx, args);
return result;
}
}
复制代码
test实现
public class test {
public static void main(String[] args) {
// 真实角色
Wo wo=new Wo();
// 代理角色:还没有指定
ProxyInvocationHand pih = new ProxyInvocationHand();
//调用真实角色的接口:制定完毕
pih.setWo(wo);
Dayouxi proxy = (Dayouxi)pih.getProxy();
proxy.play();
}
}
复制代码
设计模式就先学习到这里!
近期评论