反射實驗

package test.my;

import java.lang.reflect.*;

class Point{
	
	public int x = 1;
	public int y = 2;
	private int z = 0;
	
	public Point(){}
	
	public Point(int x,int y){
		this.x = x;
		this.y = y;
	}
	public int add(int x ,int y){
		return x + y + this.x * 2 + this.y*3;
	}
	
	@Override
	public String toString(){
		return "x = " + x + " y = " + y;
	}
}
public class ClassReflectTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		/**得到Class實例的三種方法
		 * 1.類名.class  eg:String.class
		 * 2.類的對象 .getClass()方法  eg: String s ; class<String> clazz = s.getClass()
		 * 3.Class.forName("類的全稱"); eg: Class.forName("java.lang.String");
		 *  判斷是否是數組用的是isArray()方法
		 */
		Class<String> clazzString = (Class<String>) Class.forName("java.lang.String");
		System.out.println(clazzString.newInstance().getClass());
		System.out.println(Point.class.newInstance());//x = 1 y = 2
		Class<Point> clazzPoint = Point.class;
		
		//通過反射的得到構造函數  然後構造一個對象
		Constructor conPo = clazzPoint.getConstructor(int.class,int.class);
		Point p1 = (Point) conPo.newInstance(3,4);
		System.out.println(p1);//x = 3 y =4
		
		Point p2 = new Point(5,6);
		//得到屬性  getFields() 只得到公開的屬性  getDeclaredFields()得到所有的聲明的屬性
		//Field[] fieldPoint = clazzPoint.getFields();
		Field[] fieldPoint = clazzPoint.getDeclaredFields();
		for(Field field : fieldPoint){
			System.out.println(field);
		}
		//得到某個特定屬性的值
		Field f = clazzPoint.getField("x");
		//想要得到那個對象屬性的值就用  f.get(某個對象的引用)
		System.out.println(f.get(p1) + " " + f.get(p2));
		//得到方法  注意需要時public訪問權限是纔可以找到  
		Method[] methodPoint = clazzPoint.getMethods();
		for(Method method : methodPoint){
			System.out.println(method);
		}
		
		Method m = clazzPoint.getDeclaredMethod("add", int.class,int.class);
		System.out.println(m.invoke(p1,5,5));//28
		//得到構造方法
		Constructor[] conPoint = clazzPoint.getConstructors();
		for(Constructor con : conPoint){
			System.out.println(con);
		}		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章