Java原生代理模式
测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class ProxyBean implements ProxyInterface{ private String filed = "This is a word for test!!";
@Override public String proxyMethod(String word){ return "这是一句话:"+word; }
@Override public String proxyMethod1(String word) { return "这是一句话:"+word; }
public String getFiled() { return filed; }
public void setFiled(String filed) { this.filed = filed; }
}
|
接口:
1 2 3 4
| public interface ProxyInterface { public String proxyMethod(String word); public String proxyMethod1(String word); }
|
代理类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class ProxyHandler<T> implements InvocationHandler{ private T target;
public ProxyHandler(T target) { this.target = target; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("invoke执行"); System.out.println(method.getName()); System.out.println("参数:"+ Arrays.toString(args)); return method.invoke(target, args); }
public T getProxy(){ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); Class<?>[] interfaces = target.getClass().getInterfaces(); Object o = Proxy.newProxyInstance(contextClassLoader,interfaces,this) System.out.println(o instanceof ProxyBean); System.out.println(o instanceof ProxyInterface); return (T)o; } }
|
测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
public class ProxyTest { @Test public void testProxy() throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class<?> aClass = Thread.currentThread().getContextClassLoader().loadClass("cn.ws.proxy.ProxyBean"); ProxyBean proxyBean = (ProxyBean) aClass.newInstance(); ProxyHandler<ProxyInterface> proxyHandler = new ProxyHandler(proxyBean); ProxyInterface proxy = proxyHandler.getProxy(); System.out.println(proxy.proxyMethod("测试")); } }
|
注:使用Java原生代理的时候,被代理的对象必须是实现一个接口,代理对象强转的时候只能被转换为被代理对象的接口形式。
结果:
1 2 3 4
| invoke执行 proxyMethod 参数:[测试] 这是一句话:测试
|
Cglib代理
测试对象:
1 2 3 4 5 6 7
| public class TestBean { private String filed = "This is a word for test!!";
public String proxyMethod(String word){ return "这是一句话:"+word; } }
|
代理对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method; import java.util.Arrays;
public class ProxyFactory<T> implements MethodInterceptor { private T target;
public ProxyFactory(T target) { this.target = target; }
@Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { String superName = methodProxy.getSuperName(); System.out.println("代理执行!"); System.out.println("执行方法:"+method.getName()+" 代理方法:"+methodProxy.getSuperName()+" 参数:"+ Arrays.toString(args)); return method.invoke(target,args); }
public T getProxyInstance(){ Enhancer en = new Enhancer(); en.setSuperclass(target.getClass()); en.setCallback(this); return (T)en.create(); } }
|
测试方法:
1 2 3 4 5 6 7 8 9 10 11
| public class ProxyTest { @Test public void testProxy() throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class<?> aClass = Thread.currentThread().getContextClassLoader().loadClass("cn.ws.Cglib.TestBean"); TestBean o = (TestBean)aClass.newInstance(); ProxyFactory<TestBean> proxyFactory = new ProxyFactory(o); TestBean proxyInstance = proxyFactory.getProxyInstance(); System.out.println(proxyInstance.proxyMethod("测试")); System.out.println(proxyInstance.getClass()); } }
|
结果:
1 2 3 4
| 代理执行! 执行方法:proxyMethod 代理方法:CGLIB$proxyMethod$0 参数:[测试] 这是一句话:测试 class cn.ws.Cglib.TestBean$$EnhancerByCGLIB$$1d1cb9da
|