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 自動代理 的原理是  根據 類加載器和接口  建立代理類(此代理類是接口的實現類,因此必須使用接口
		
		// 一、 建立真是業務對象的引用
		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();
		
	}
}
相關文章
相關標籤/搜索