1. 程式人生 > >什麼是Java反射機制以及動態代理

什麼是Java反射機制以及動態代理

反射機制定義

Java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法,對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。

反射機制獲取類的三種方式

1.類名.class

		//通過類名.class獲取類資訊
		Class c = Car.class; 
		//獲取類方法
		Method[] methods = c.getMethods();
		//列印方法名稱
		for(Method method : methods){
			System.out.println(method.getName());
		}

2.通過物件的getClass()方法獲取
		//建立物件例項
		Car car = new Car();
		//通過物件的getClass()方法獲取類資訊
		Class c = car.getClass();
		//獲取類的建構函式
		Constructor[] con = c.getConstructors();
		//列印建構函式的名稱
		for(Constructor cc:con){
			System.out.println(cc.getName());
		}
 3.通過全類名獲取Class.forName()
		//通過全類名Class.forName獲取類資訊
		Class c = Class.forName("classDemo.Car");
		//通過class中的netInstance()方法例項化Car物件
		Car o =  (Car)c.newInstance();
		//呼叫car物件中的test()方法
		o.test();
   

使用場景

跨網路的遠端平臺建立和執行物件的能力,即遠端方法呼叫(RMI) 逆向工程 基於註解實現的框架

動態代理

代理:基本的設計模式之一,它是為了提供額外的或不同的操作,而插入的用來代替“實際”物件的物件。
代理通常充當著中間人的角色。
public interface objectDemo {
	public void doSomething();
}

/**
 * 被代理實現類
 * @author liumengxi
 *
 * 2017-12-31
 */
public class objectDemoImpl implements objectDemo {

	@Override
	public void doSomething() {
		
		System.out.println("objectDemoImpl");

	}

}
/**
 * 代理實現類
 * @author liumengxi
 *
 * 2017-12-31
 */
public class proxyObjectDemoImpl implements objectDemo {

	
	private objectDemoImpl dl;
	
	public proxyObjectDemoImpl(objectDemoImpl dl){
		this.dl = dl;
	}
	@Override
	public void doSomething() {
		System.out.println("proxyObjectDemoImpl dosomething....");
		dl.doSomething();

	}

}
/**
 * 測試
 * @author liumengxi
 *
 * 2017-12-31
 */
public class proxyObjectMain {

	public static void consumer(objectDemo od){
		od.doSomething();
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		//執行被代理類方法
		consumer(new objectDemoImpl());
		//執行代理類方法
		consumer(new proxyObjectDemoImpl(new objectDemoImpl()));
		
	}

}

動態代理:動態的建立代理並動態地處理對所代理方法的呼叫。在動態代理上所做的所有呼叫都會被重定向到單一的呼叫處理器上,它的工作是揭示呼叫的型別並確定相應的對策。
/**
 * 動態代理
 * @author liumengxi
 *
 * 2017-12-31
 */
public class DynamicProxyHandler implements InvocationHandler {

	private Object proxid;
	
	public DynamicProxyHandler(Object proxid){
		
		this.proxid = proxid;
	}
	
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		
		//mthod.invoke將請求轉發給被代理物件執行
		return method.invoke(proxid, args);
	}

}
/**
 * 測試
 * @author liumengxi
 *
 * 2017-12-31
 */
public class proxyObjectMain {

	public static void consumer(objectDemo od){
		od.doSomething();

	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		

		
		//執行被代理類方法
		objectDemoImpl od = new objectDemoImpl();
		consumer(od);
		
		/**
		 * 建立動態代理
		 * Proxy.newProxyInstance()可以建立動態代理
		 * 以下為newProxyInstance引數
		 * objectDemo.class 類載入器
		 * new Class[]{objectDemo.class} 該代理實現的介面
		 * DynamicProxyHandler InvocationHandler介面的一個實現
		 */
		objectDemo o = (objectDemo) Proxy.newProxyInstance(objectDemo.class.getClassLoader(), 
				new Class[]{objectDemo.class}, new DynamicProxyHandler(od));
		
		
		consumer(od);
		
		
	}

}