动态代理
今天看了一下关于动态代理的东西,于是记录一下关于动态代理的东西。
Java的动态代理:
代理模式是Java常用的一种设计模式,下面我通过举例来描述一下动态代理。
动态代理的相关类和方法:InvocationHandler类:public Object invoke(Object proxy, Method method, Object[] args)
Proxy.public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
假设接口A用方法run(),接口A的实现类B也有run()方法。而动态代理是给类B找了一个兄弟,他会冒充B类(伪B),并且实现A接口,来替B完成任务。
动态代理的原理是在InvocationHandler让用户自己添加要实现的逻辑:在invoke()方法中自己定义要增加的逻辑(相当于spring中的增强),在Proxy的newProxyInstance()中
传入InvocationHandler的实现,在这里Proxy重新编译代码,将增加的逻辑编译到代码中,下面一个通过动态原理生成的代理对象的java代码:
import java.lang.reflect.Method;
public class $Proxy1 implements UserMgr{
public $Proxy1(InvocationHandler h) {
this.h = h;
}
InvocationHandler h;
@Override
public void addUser() {
try {
Method md = UserMgr.class.getMethod("addUser");
h.invoke(this, md);
}catch(Exception e) {e.printStackTrace();}
}}
用jdk自带的Proxy类进行动态代理,需要被代理的类实现一个接口。
public interface Moveable {
void run();
}
public class Car implements Moveable{
@Override
public void run() {
System.out.println("车在跑。。。。");
}
}
package cn.edu.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class RunProxy implements InvocationHandler { private Object target; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("Begining....."); result = method.invoke(target,args); System.out.println("Stopping...."); return result; } public Object bind(Object target) { this.target=target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } }
测试类
public class Test { public static void main(String[] args) { Car car = new Car(); RunProxy runProxy = new RunProxy(); Moveable proxy=(Moveable) runProxy.bind(car); proxy.run(); } }
运算结果:
Begining.....
车在跑。。。。
Stopping....