JavaJDK动态代理模式的实现
- 首先说一下JDK的实现原理
1.拿到被代理对象的引用,然后获取他的接口
2.JDK代理重新生成一个类,同时实现我们给的代理对象所实现的接口
3.把被代理对象的引用拿到了
4.重新动态生成一个class字节码
5.然后编译
然后实现一个动态代理,首先是实现java.lang.reflect.InvocationHandler
接口,并使用java.lang.reflect.Proxy
的静态方法newProxyInstance()
方法生成代理对象
public class DymaicProxy implements InvocationHandler{
public Object obj;//被代理的对象
public DymaicProxy(Object obj){
this.obj = obj;//接受客户
}
/**
* invoke():拿到想要被代理的对象
* 参数介绍:
* 第一个参数:被代理的真实对象
* 第二个参数:代表被动态代理类调用的方法。从中可得到方法名,参数类型,返回类型等等
* 第三个参数:代表被调用方法的参数
* 额外补充:因为是动态代理,所以可以实现一些特殊的功能,可以扩展增强其功能,
*
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(this.obj, args);
return result;
}
}
然后是实现类
public static void main(String[] args) {
Customer customer = new Customer();
customer.setName("某某人");
customer.setMoney(2000); //实例对象并赋值
//Java反射之getInterfaces()方法:可以获取某一类对像所所实现的接口
//System.out.println(customer.getClass().getInterfaces()[0]);
InvocationHandler handler = new DymaicProxy(customer); //将对象传到上面写的类,他会自动执行invoke()方法并得到该对象的值
/*
* 通过Proxy类的newProxyInstance()方法来创建我们的代理对象,我们来看看其三个参数
* 第一个参数:类加载器,我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象
* 第二个参数:对象要实现哪些接口:我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
* 第三个参数:它是一个接口!它的名字叫调用处理器,使用新建的proxy对象调用方法的时候,都会调用到该接口中的invoke方法。 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
*/
HomeZuLin home = (HomeZuLin) Proxy.newProxyInstance(handler.getClass().getClassLoader(), customer.getClass().getInterfaces(), handler);
home.zuhome();
}