jdk動態代理舉例

JDK動態代理是基於接口的代理,下面舉例說明ide

  • 代理類:proxy,代理動做必需要基於一個proxy實例來執行
  • 代理執行類:實現InvocationHandler,案例中是TestInvocationHandler
  • 被代理類:基於接口的用戶本身的方法,案例中是SayImpl

首先說明下InvocationHandler的invokethis

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

proxy:方法基於哪一個proxy實例來執行spa

method:執行proxy實例的哪一個方法(proxy代理誰就執行誰的方法)代理

args:methed的入參code

 

代碼示例:blog

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 endget

相關文章
相關標籤/搜索