jdk动态代理举例

JDK动态代理是基于接口的代理,下面举例说明

  • 代理类:proxy,代理动作必须要基于一个proxy实例来执行
  • 代理执行类:实现InvocationHandler,案例中是TestInvocationHandler
  • 被代理类:基于接口的用户自己的方法,案例中是SayImpl

首先说明下InvocationHandler的invoke

public interface InvocationHandler {
  public Object invoke(Object proxy, Method method, Object[] args)
          throws Throwable;
}

proxy:方法基于哪个proxy实例来执行

method:执行proxy实例的哪个方法(proxy代理谁就执行谁的方法)

args:methed的入参

 

代码示例:

public interface Say {
    void sayHello(String words);
}
public class SayImpl implements Say {
    @Override
    public void sayHello(String words) {
        System.out.println("hello:" + words);
    }
}
public class TestInvocationHandler implements InvocationHandler {

    private Object target;
    public TestInvocationHandler(Object target) {
        this.target=target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("invoke begin");
        System.out.println("method :"+ method.getName()+" is invoked!");
        method.invoke(target,args);
        System.out.println("invoke end");
        return null;
    }
}
    public static void main(String[] args) {

        TestInvocationHandler testInvocationHandler = new TestInvocationHandler(new SayImpl());
        Say say = (Say)Proxy.newProxyInstance(SayImpl.class.getClassLoader(), SayImpl.class.getInterfaces(), testInvocationHandler );
        say.sayHello("my dear");
    }

 

执行结果:

invoke begin
method :sayHello is invoked!
hello:my dear
invoke end

 

posted @ 2017-12-24 17:22  此生重演  阅读(3753)  评论(2编辑  收藏  举报