代理模式
代理模式proxy
含义
代理,顾名思义,就是第三方作为一个中间来进行一些原本功能上的修改,例如房东和房介之间的关系,房东就是被代理目标,房介就是代理对象,房东和房介都有一个目标就是出租房屋,但是房东只需要出租,而房介会在房东出租前后做一些事情的添加,比如在出租房子之前进行看房,出租房子之后进行签协议等等操作。换句话说代理就是可以在被代理对象的基础上进行的附加操作
在Java中静态代理也就是通过自己来完成代理类的创建,被代理目标类和代理类都实现同一个接口,然后代理类中有一个被代理目标的实例变量,当调用代理对象的方法时,会在该方法中调用被代理目标的方法
下面以租房为例子:
租房接口:
public interface ChuZu{ void rent(); }
房东类(被代理对象):
public class Landlord implements ChuZu{
public void rent{
System.out.println("进行出租房屋");
}
}
房介类(代理对象):
public class Agent implements ChuZu{
private Landlord landlord;
public Agent(Landlord landlord){
this.landlord=landlord;
}
public void rent{
System.out.println("进行看房");
landlord.rent();
System.out.println("签订合同");
}
}
动态代理
动态代理需要使用到java.lang.reflect包下的proxy类来进行动态代理,动态代理也就是不需要创建这么一个代理类,通过proxy类来生成一个动态的代理对象,然后实现代理操作
具体操作是:首先调用proxy类的newProxyInstance()方法来获取到这个动态代理对象,但是这个方法有三个参数 (ClassLoader , Class< ? >[] , InvocationHandler) 其中ClassLoader 也就是类加载器,需要传入被代理目标类的类加载器,Class< ? >[] 需要传入被代理目标类的所有实现接口,handler就是进行代理附加的操作,例如方法执行前后执行日志功能,loader和interfaces都可以通过反射轻松获取到被代理目标类的类加载器和接口,InvocationHandler怎么传呢,InvocationHandler是一个接口,也没有实现类,但是我们知道接口是可以通过匿名内部类来创建一个接口对象的,在InvocationHandler接口中需要重写一个invoke方法 ,看到是否很眼熟,invoke也就是Method反射中进行方法调用的方法,在InvocationHandler接口中的invoke方法中有三个参数 (Object proxy, Method method, Object[] args) proxy是指当前被代理的对象,这个不用管,method是调用的方法,当代理类对象调用该方法时回去调用代理目标的方法,args为传入方法的参数
具体代码
ProxyTarget proxyTarget = new ProxyTarget();//这是一个被代理目标对象
ClassLoader classLoader=proxyTarget.getClass().getClassLoader();//获取代理目标的类加载器
Class<?>[] interfaces = proxyTarget.getClass().getInterfaces();//获取代理对象的接口
InvocationHandler ih=new InvocationHandler{

浙公网安备 33010602011771号