Proxy类实现java动态代理


动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。
代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,
代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。

1.JDK代理使用的是反射机制实现aop的动态代理

2.JDK动态代理是通过方法调用,在调用目标方法前后增加代码来实现类行为改变

3.JDK动态代理机制是委托机制,具体说动态实现接口类,在动态生成的实现类里面委托hanlder去调用原始实现类方法,

目前Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。 其实现主要通过java.lang.reflect.Proxy类
和java.lang.reflect.InvocationHandler接口。

Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现

通过动态代理实现在方法调用前后向控制台输出两句字符串:

   1.定义一个HelloWorld接口

  package com..test;
  
   /**
   * 定义一个HelloWorld接口
   * 
   */
   public interface HelloWorld {
     public void sayHelloWorld();
 }
2.类HelloWorldImpl是HelloWorld接口的实现

  package com..test;
  
   /**
   * 类HelloWorldImpl是HelloWorld接口的实现
   * 
   *
   */
   public class HelloWorldImpl implements HelloWorld{
 
     public void sayHelloWorld() {
         System.out.println("HelloWorld!");
     }
 
 }
3.HelloWorldHandler是 InvocationHandler接口实现



package com..test;
  
   import java.lang.reflect.InvocationHandler;
   import java.lang.reflect.Method;
  
   /**
   * 实现在方法调用前后向控制台输出两句字符串
   * 
  */
  public class HelloWorldHandler implements InvocationHandler{
     //要代理的原始对象
      private Object obj;
     
     public HelloWorldHandler(Object obj) {
         super();
         this.obj = obj;
     }
 
     /**
      * 在代理实例上处理方法调用并返回结果
      * 
      * @param proxy 代理类
      * @param method 被代理的方法
      * @param args 该方法的参数数组
      */
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
         Object result = null;
         //调用之前
          doBefore();
         //调用原始对象的方法
         result=method.invoke(obj, args);
         //调用之后
         doAfter();
         return result;
     }
     
     private void doBefore(){
         System.out.println("before method invoke");
     }
     
     private void doAfter(){
         System.out.println("after method invoke");
     }
     
 }
4.测试
package com..test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;


public class HelloWorldTest {

    public static void main(String[] args) {
        HelloWorld helloWorld=new HelloWorldImpl();
        InvocationHandler handler=new HelloWorldHandler(helloWorld);
        
        //创建动态代理对象
        HelloWorld proxy=(HelloWorld)Proxy.newProxyInstance(
                helloWorld.getClass().getClassLoader(), 
                helloWorld.getClass().getInterfaces(), 
                handler);
        proxy.sayHelloWorld();
    }
}
原文地址:https://www.cnblogs.com/lifan12589/p/14022943.html