---------------------- android培训 、java培训 、期待与您交流! ----------------------
动态代理模式
代理是只在不改变源文件的情况下,在源文件的功能基础上,添加其他的功能。比如
添加日志、权限检查等等,而不对原来的纵向业务逻辑产生影响。当不需要这些新添加的
功能的时候,可以直接很简单去除这些功能。
代理的实现
静态代理的实现可以通过继承 、实现同一接口(聚合)的方式来实现。但是继承实现
起来很不方便,当需要实现的代理功能多时,会使类越来臃肿。所以一般都使用实现接口的方式来
实现代理。这个时候新的问题又出现了,当我们需要对很多类进行代理的时候,程序又变得笨拙,
因此,我们需要对不同的类动态的产生代理对象。这就是动态代理。
动态代理可以对任意对象,任意接口的方法,实现任意的代理
动态代理的原理是根据传入的对象动态生成代码。
实现动态代理的步骤
1 被代理类需要实现一个接口
2 创建代理类实现InvocationHandler 并重写invoke方法。
3 调用方法自身的invoke, 这时可以在invoke方法前后加入需要的逻辑
4 在主函数中创建接口对象和InvocationHandler对象
5 调用Proxy.newProxyInstance()传入接口对象的类加载器、接口对象和InvocationHandler对象
6 调用需要被代理的烦方法
实例
//创建被代理类的接口对象
public interface Car {
void run();
void stop();
}
//被代理类实现接口
public class Tank implements Car {
public void run() {
System.out.println("run.........");
}
@Override
public void stop() {
System.out.println("stop..........");
}
}
//创建代理类并实现InvocationHandler接口,重写invoke方法
public class LogHandler implements InvocationHandler{
private Car tank;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before log");//加入需要的逻辑
Object tank=method.invoke(this.tank,args);//调用自身的invoke方法
addLog();//加入需要的逻辑
return tank;//返回invoke方法返回的值
}
public LogHandler(Tank tank) {
super();
this.tank = tank;
}
public void addLog(){
System.out.println("add log");
}
public LogHandler(Car tank) {
super();
this.tank = tank;
}
}
//主函数
public class Test {
public static void main(String[] args) {
//创建接口对象
Car c = new Tank();
//创建被代理类对象
InvocationHandler h = new LogHandler(c);
//调用 Proxy.newProxyInstance方法传入参数分别是: 被代理类的类加载器,被代理类实现的接口 ,代理类
Car car =(Car) Proxy.newProxyInstance(c.getClass().getClassLoader(), c.getClass()
.getInterfaces(), h);
car.run();//调用被代理类中的方法
}
}
---------------------- android培训 、java培训 、期待与您交流! ----------------------