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);
}
}
}
反射實驗
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.