标签:接口 cat 类对象 run方法 列表 new 时间 jdk 动态代理模式
/* 代理模式
 * 
 * 生活中:
 * 	  (1)自己不方便做一些事情,例如:去国外   找代购 租房 买房 等等...
 * 1、代理模式
 * (1)主题接口:要求代理类与被代理类实现同一个接口,例如:DAO接口    
 * (2)被代理者
 * (3)代理者
 * 	 必须持有被代理者的引用
 * 
 * 2、静态代理模式
 * 缺点:一个代理类只能替一个代理主题(接口)代理工作
 * 
 * 3、动态代理模式
 * 优点:一个代理工作处理器,可以替多个代理主题代理工作,只有代理工作内容一样就可以。
 * 需要:
 * (1)编写一个代理工作处理器的类,这个类必须实现一个接口InvocationHandler
 * (2)用JDK中提供了一个Proxy类,来创建代理类的对象
 * (3)调用方法
示例: 静态代理
interface A{
	  void run();
}
class B implements A{
	  @Override
	  public void run() {
		    for (int i = 0; i < 1000; i++) {
			      System.out.println(i);
		    }
	  }
}
class StaticProxy implements A{
	  private A a;
	  public StaticProxy(A a) {
		    this.a = a;
	  }
	  @Override
	  public void run() {
		    System.out.println("run方法执行");
		    long start = System.currentTimeMillis();
		    a.run();
		    long end = System.currentTimeMillis();
		    System.out.println("执行时间:" + (end - start));
		    System.out.println("run方法执行结束");
	  }
}
静态代理的使用:new StaticProxy(new B()).run()
示例:动态代理
interface C {
	  void run();
}
class CImpl implements C{
	  @Override
	  public void run() {
		    System.out.println("C接口的run方法执行中");
	  }
}
class DynamicProxy implements InvocationHandler {
  //被代理的对象
	  private Object obj;
	  public DynamicProxy(Object obj){
		    this.obj = obj;
	  }
  /*
	   * 参数一:代理类的对象
	   * 参数二:被代理者要执行的方法
	   * 参数三:被代理者要执行的方法需要的实参列表
	   * 这个方法不是程序调用的,是一会执行代理类对象的方法时自动调用
	   */
	  @Override
	  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		    System.out.println(method.getName() + "方法执行");
		    long start = System.currentTimeMillis();
		    Object object = method.invoke(obj, args);
		    long end = System.currentTimeMillis();
		    System.out.println("执行时间:" + (end - start));
		    System.out.println(method.getName() + "方法执行结束");
		    return object ;
	  }
}
动态代理使用:
public class TestProxy2 {
	  public static void main(String[] args) {
		    Class clazz = CImpl.class;
		    ClassLoader loader = clazz.getClassLoader();
		    Class[] interfaces = clazz.getInterfaces();
		    C proxy = (C) Proxy.newProxyInstance(loader, interfaces, new DynamicProxy(clazz));
		    proxy.run();
}
}
标签:接口 cat 类对象 run方法 列表 new 时间 jdk 动态代理模式
原文地址:https://www.cnblogs.com/dirsoen/p/12642747.html