jdk动态代理实现
说jdk动态代理模式,先来说一下什么是代理模式,顾名思义,就是别人需要做的活让其他人代理做了。比较常见的是,我需要买火车票,我现在没有办法去火车站购买,找到离我最近的火车票代理点购买火车票。而jdk实现的代理模式实现起来比较简单,重写接口方法,但是业务模块需要实现接口才能使用jdk的代理模式。重写的接口之前还需要了解一个东西,那就是java的反射机制,这里不详细说反射机制。
JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的 业务实现类对象 以及 方法名 ,动态地创建了一个代理类的class文件并被字节码引擎执行,然后通过该代理类对象进行方法调用。我们需要做的,只需指定代理类的预处理、调用后操作即可。代理类需要重写接口
java.lang.reflect.InvocationHandler里面的invoke()方法。
1定义业务逻辑层接口
public interface BuyFacade {
public void addCustomer();
}
2实现业务逻辑层类
public class BuyFacadeImpl implements BuyFacade {
@Override
public void addCustomer() {
System.out.println("添加一个新的用户。。。。");
}
}
3代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class BuyProxy implements InvocationHandler {
private Object trage;
/**
* 绑定业务对象并返回代理对象
* @param trage
* @return
*/
public Object bind(Object trage) {
this.trage = trage;//接收业务层的对象
//通过反射机制,创建一个代理类对象实例并返回。用户进行方法调用时使用
//创建代理对象时,需要传递该业务类的类加载器(用来获取业务实现类的元数据,在包装方法是调用真正的业务方法)、接口、handler实现类
return Proxy.newProxyInstance(trage.getClass().getClassLoader(), trage.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行方法之前---------");
Object result = method.invoke(trage, args);
System.out.println("执行方法之后---------");
return result;
}
}
4测试方法
public static void main(String[] args){
BuyFacadeImpl buyFacadeImpl = new BuyFacadeImpl();
BuyProxy buyProxy = new BuyProxy();
BuyFacade buyFacade = (BuyFacade) buyProxy.bind(buyFacadeImpl);
buyFacade.addCustomer();
}
结果:
执行方法之前————-
添加一个新的用户。。。。
执行方法之后————-
还没有评论,来说两句吧...