java反射

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();
		
	}
}

  

posted @ 2017-10-10 22:56  马云12314  阅读(162)  评论(0编辑  收藏  举报