网站域名根目录在哪里深圳搜索引擎优化seo
JDK 自带的动态代理
- java.lang.reflect.Proxy:生成动态代理类和对象;
- java.lang.reflect.InvocationHandler(处理器接口):可以通过invoke方法实现
RealSubject真实对象,将它注册到处理器,然后创建一个代理类,传入处理器和真实类实现的接口,最后就可以代理真实对象了
每次通过 Proxy 生成的代理类对象都要指定对应的处理器对象。然后代理类调用方法时,自动调用处理器的invoke方法
代码:
a) 接口:Subject.java
package proxy.dynamic;public interface Subject
{public int sellBooks();public String speak();
}
b)真实对象:RealSubject.java
package proxy.dynamic;public class RealSubject implements Subject{@Overridepublic int sellBooks() {System.out.println("卖书");return 1 ;}@Overridepublic String speak() {System.out.println("说话");return "张三";}
}
c)处理器对象:MyInvocationHandler.java
package proxy.dynamic;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** 定义一个处理器,里面包含了真实对象* @author gnehcgnaw* @date 2018/11/5 19:26*/
public class MyInvocationHandler implements InvocationHandler {/*** 因为需要处理真实角色,所以要把真实角色传进来*/Subject realSubject ;public MyInvocationHandler(Subject realSubject) {this.realSubject = realSubject;}/**** @param proxy 代理类* @param method 正在调用的方法* @param args 方法的参数* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("调用代理类");if(method.getName().equals("sellBooks")){int invoke = (int)method.invoke(realSubject, args);System.out.println("调用的是卖书的方法");return invoke ;}else {String string = (String) method.invoke(realSubject,args) ;System.out.println("调用的是说话的方法");return string ;}}
}
d)调用端:Client.java
package proxy.dynamic;import java.lang.reflect.Proxy;/*** 调用类* @author gnehcgnaw* @date 2018/11/7 20:26*/
public class Client {public static void main(String[] args) {//真实对象Subject realSubject = new RealSubject();//创建处理器,传入真实对象MyInvocationHandler myInvocationHandler = new MyInvocationHandler(realSubject);/*** 利用Proxy类的静态方法newProxyInstance()创建代理对象,传入类加载器,真实类的接口,处理器*/Subject proxyClass = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Subject.class}, myInvocationHandler);//代理类代替真实类进行操作proxyClass.sellBooks();proxyClass.speak();}
}
调用代理类
卖书
调用的是卖书的方法
调用代理类
说话
调用的是说话的方法