首先說下反射是什么?反射是Sun公司推出的一組API,此組API位於Java.lang.reflect中
反射的作用是編寫工具(例如eclipse),編寫框架,當然對於一般的程序,我們不可能用反射來做這些事,一般反射大多是用於在構建類的實例以及調用類方法及屬性。
ok! 了解了反射是什么以及反射的應用領域,那么就來看看Java中是怎么實現反射的吧
Student類
public class Student { public String name; public String gender; public int age; public Student(){ } }
使用反射獲取類的實例
public class Test { public static void main(String[] args)throws ReflectiveOperationException { //通過三種方式獲取類的類對象 Class<?> c=Student.class; Class<?> c1=new Student().getClass(); Class<?> c2=Class.forName("Student");//通過包名.類名獲取類對象(因為該類在default包,所以可以不寫包名) //通過類對象來構建student實例,效果和new Student()一樣,要求Student中必須要有無參的構造函數 Student s=(Student) c.newInstance(); Student s1=(Student) c1.newInstance(); Student s2=(Student) c2.newInstance(); s.age=1; s1.age=2; s2.age=3; System.out.println(s.age); System.out.println(s1.age); System.out.println(s2.age); }
可以看到,正確的輸出了1,2,3
通過反射獲取類的屬性及方法,動態執行
Student類型
public class Student { public String name; private int age;//該屬性為私有,可以通過反射獲取得到 public Student(){ } public int add(int a,int b){ return a+b; } @Override public String toString() { // TODO Auto-generated method stub return "name="+name+"\nage="+age; } }
動態的給類的屬性賦值和調用類的方法
public class Test { public static void main(String[] args)throws ReflectiveOperationException { //獲取類對象 Class<?> c=Class.forName("Student"); //獲取類的屬性對象,需要填寫屬性對象的名稱 Field f1=c.getField("name");//只能獲取public的對象 Field f2=c.getDeclaredField("age");//可以獲取到private的對象,這很吊吧 f2.setAccessible(true);//如果屬性是私有的,那么就需要設置可訪問 Student s1=(Student) c.newInstance(); //為屬性對象賦值 f1.set(s1, "張三"); f2.set(s1, 22); System.out.println(s1.toString()); //通過類對象獲取類的方法 Method m1=c.getMethod("add", int.class,int.class); //動態的執行方法 int sum=(int) m1.invoke(s1, 1,2); System.out.println(sum); } }