import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.junit.Test; interface Fly { public void gotoFly(); public void stopFly(); } class Bird implements Fly{ @Override public void gotoFly() { System.out.println("鳥兒張開翅膀要飛起來了。。。。"); } @Override public void stopFly() { System.out.println("準備停飛。。。。"); } public void eatBug(){ System.out.println("鳥要吃蟲子,補充體力。。。"); } } public class ProxyTest { @Test public void demo1(){ // JDK 自動代理 的原理是 根據 類加載器和接口 建立代理類(此代理類是接口的實現類,因此必須使用接口 // 一、 建立真是業務對象的引用 Fly fly = new Bird(); Fly proxy = (Fly) Proxy.newProxyInstance(fly.getClass().getClassLoader(), fly.getClass().getInterfaces(), new InvocationHandler() { // 二、使用真是業務對象類加載器和接口,在內存中建立代理對象 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()); // 攔截方法 if(method.getName().equals("stopFly")){ System.out.println("被攔截了,鳥飛不走了。。。"); return null; } // 不攔截就invoke return method.invoke(proxy, args); } }); proxy.stopFly(); proxy.gotoFly(); } }