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 自动代理 的原理是 根据 类加载器和接口 创建代理类(此代理类是接口的实现类,所以必须使用接口 // 1、 创建真是业务对象的引用 Fly fly = new Bird(); Fly proxy = (Fly) Proxy.newProxyInstance(fly.getClass().getClassLoader(), fly.getClass().getInterfaces(), new InvocationHandler() { // 2、使用真是业务对象类加载器和接口,在内存中创建代理对象 @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(); } }