按代理创建的时间,可以分为静态代理和动态的代理
静态代理:在程序运行之前,代理类就以.class文件格式存在
动态代理:在程序运行时,由反射机制动态创建而成。
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
静态代理例子:
//抽象主题interface Subject{void operator();}//具体主题class RealSubject implements Subject{@Overridepublic void operator(){System.out.println("RealSubject Operator()");}}//代理类class ProxySubject implements Subject{private Subject subject;public ProxySubject(Subject subject){this.subject = subject;}@Overridevoid operator(){System.out.println("Proxy Before");subject.operator();System.out.println("Proxy after");}}//客户端class client{public static void main(String[] args){Subject subject = new RealSubject();ProxySubject proxy = new ProxySubject(subject);proxy.operator();}}
静态代理的弊端就是代理类要实现一个具体的类,由此引申出动态代理,让我们的具体的代理类在运行时候通过JAVA反射机制去创建。
动态代理核心是这两个类:Proxy.java 和InvocationHander.java
Proxy的newProxyInstance帮我们执行了生成代理类——获取构造器——生成代理对象这三步;
//调度处理器接口interface InvocationHandler{/*** invode方法封装了我们要代理的对象实例的数据。* @param proxy 代理的对象的实例* @param method 代理实现的方法* @param args 代理方法需要的参数*/public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;}//代理类,相当于静态代理中ProxySubject功能class Proxy{public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h){//...}}
动态代理例子:
//抽象主题interface Subject{void operator();}//具体主题class RealSubject implements Subject{@Overridepublic void operator(){System.out.println("RealSubject Operator()");}}//代理类class ProxyHandler implements InvocationHandler{private Object tar;public Object bind(Object tar){this.tar = tar;return Proxy.newProxyInstance(tar.getClass().getClassLoader(),tar.getClass().getInterfaces(),this)}@Overridepublic Object invoke(Object proxy,Method method,Object[] args){Object result = null;//这里就可以进行所谓的AOP编程了//在调用具体函数方法前,执行功能处理System.out.println("Proxy Before");result = method.invoke(tar,args)System.out.println("Proxy after");return result;}}//客户端class client{public static void main(String[] args){//Subject subject = new RealSubject();ProxyHandler proxy = new ProxyHandler();//这一步动态生成代理类Subject subject = proxy.bind(new RealSubject())subject.operator();}}
