基础类,创建一个接口和一个实现方法
package com.opk.proxy; public interface BuyHouse { void buyHouse(); }
package com.opk.proxy; public class BuyHouseImpl implements BuyHouse { @Override public void buyHouse() { System.out.println("我要买房"); } }
package com.opk.proxy; public class BuyHouseProxy implements BuyHouse { private BuyHouse buyHouse; public BuyHouseProxy(final BuyHouse buyHouse) { this.buyHouse = buyHouse; } @Override public void buyHouse() { System.out.println("买房前准备"); buyHouse.buyHouse(); System.out.println("买房后装修"); } }
package com.opk.proxy; public class ProxyTest { public static void main(String[] args) { BuyHouse buyHouse=new BuyHouseImpl(); buyHouse.buyHouse(); BuyHouseProxy buyHouseProxy=new BuyHouseProxy(buyHouse); buyHouseProxy.buyHouse(); } }
测试结果:
1、使用本地方法实现动态代理
package com.opk.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicProxyHandler implements InvocationHandler { private Object object; public DynamicProxyHandler(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("买房前准备"); Object result = method.invoke(object, args); System.out.println("买房后装修"); return result; } }
package com.opk.proxy; import java.lang.reflect.Proxy; public class DynamicProxyTest { public static void main(String[] args) { BuyHouse buyHouse = new BuyHouseImpl(); BuyHouse proxyBuyHouse = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new Class[]{BuyHouse.class}, new DynamicProxyHandler(buyHouse)); proxyBuyHouse.buyHouse(); } }
测试结果:
2、使用cglib实现动态代理
package com.opk.proxy; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CglibProxy implements MethodInterceptor { private Object target; public Object getInstance(final Object target) { this.target=target; Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(this.target.getClass()); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("买房前准备"); Object invoke = methodProxy.invokeSuper(o, objects); System.out.println("买房后装修"); return invoke; } }
package com.opk.proxy; public class CglibProxyTest { public static void main(String[] args) { BuyHouse buyHouse=new BuyHouseImpl(); CglibProxy cglibProxy=new CglibProxy(); BuyHouseImpl instance = (BuyHouseImpl) cglibProxy.getInstance(buyHouse); instance.buyHouse(); } }
测试结果:
总结:cglib实现动态代理效率会比本地方法高,但是创建对象频繁,如果是单例对象使用cglib实现动态代理,反之,则使用java的本地方法
原文:https://www.cnblogs.com/mingyuan1031/p/11551393.html