Java 代理模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 代理模式相关的知识,希望对你有一定的参考价值。
代理模式的概念:为其他对象提供一种代理一控制对这个对象的访问。
应用场景:在开发中一些业务类中方法,除了需求的操作,还需要进行其他的非业务操作。比如提供给app的接口。除了接口要实现的业务逻辑,还要对用户的信息,设备的信息进行验证,参数的加密解密。这种在每个接口方法前都要调用的,和业务代码参在一起就会重复,累赘。可以通过代理类将这些经常使用的方法抽取出来。业务类只用关心业务操作,降低耦合。
静态代理
代理和被代理对象在代理前是确定的。他们都实现了相同的接口或者继承了相同的抽象类。
动态代理
动态产生代理,实现对不同类,不同方法进行代理
1) JDK动态代理
java提供了动态代理技术,允许开发者在运行期创建接口的代理实例。JDK动态代理主要涉及到java.lang.reflect包下的Proxy和InvocationHandler.
接口
public interface TrafficTools{ public void drive(); }
实现
public class Car implements TrafficTools { @Override public void drive() { System.out.println("汽车 行驶中。。。"); } }
代理类
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class CarProxy implements InvocationHandler{ public CarProxy(Object target) { super(); this.target = target; } private Object target; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { long start = System.currentTimeMillis(); System.out.println("汽车开始行驶。。。"); method.invoke(target); long end = System.currentTimeMillis(); System.out.println("汽车结束行驶。。。"+(end - start)); return null; } }
测试代理
import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { Car car = new Car(); CarProxy h = new CarProxy(car); Class<?> cls = car.getClass(); TrafficTools t = (TrafficTools)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h); t.drive(); } }
2)CGLib动态代理
JDK动态代理只能为接口创建动态代理,CGLib采用非常底层的字节码技术,可以为一个类创建代理。需要引用cglib的jar包。
import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibProxy implements MethodInterceptor{ private Enhancer enhancer = new Enhancer(); public Object getProxy(Class clazz){ enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } /*** * 拦截所有目标类的方法调用 */ @Override public Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable { return proxy.invokeSuper(obj, args); } }
CGLib所创建的动态代理对象的性能比JDK的所创建的代理对象的性能高很多。但CGLIb在创建代理对象时所花费的时间比JDK动态代理多。
以上是关于Java 代理模式的主要内容,如果未能解决你的问题,请参考以下文章