java reflect(1)

java reflect 學習

1.如何實現從一個類名(”java.util.ArrayList”)到類(ArrayList.class)再到實例化(Object,相當於new ArrayList())的過程轉化?這個過程中需要處理哪些異常?

public class Demo1{

       private int i = 1;

       public static void main(String[] args){

              try{

                     Class class1 = Class.forName(“reflect.Demo1”);

                     Demo1 demo1 = (Demo1)class1.newInstance();

                     System.out.println(demo1.i);

              }catch(ClassNotFoundException e) {

                     e.printStackTrance();

              }catch(InstatiationException e1) {

                     e.printStackTrance();

              }catch(IllegaAccessException e2) {

                     e.printStackTrance();

              }

       }

}

 

2.請說明如何獲得一個對象的類名、包名?

public class Demo1{

       public static void main(String[] args) {

              String packageName = Demo1.class.getPackage().getName();

              String objName = Demo1.class.getName();

              String objSimpleName = Demo1.class.getSimpleName();

       }

}

 

3.請說明如何獲得一個類(Class)的所有域(Field),包括其父類的域。

package reflect;

import java.lang.reflect.Field;

public class Father {

       private String fname = "father";

       private int fage = 40;

       public static void main(String[] args) {

              try {

                     Class<Son> class1 = (Class<Son>) Class.forName("reflect.Son");

                     Son son = class1.newInstance();

                     Field[] fields = son.getClass().getDeclaredFields();   //getFields() 只能獲得非private 以外的成員變量

                     for (Field field : fields) {

                            System.out.println(field.getName());

                     }

                     Field[] fields1 = son.getClass().getSuperclass().getDeclaredFields(); 

                     for (Field field : fields1) {

                            System.out.println(field.getName());

                     }

              } catch (ClassNotFoundException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (InstantiationException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (IllegalAccessException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              }

               

       }

       public String getFname() {

              return fname;

       }

       public void setFname(String fname) {

              this.fname = fname;

       }

       public int getFage() {

              return fage;

       }

       public void setFage(int fage) {

              this.fage = fage;

       }

}

class Son extends Father{

       private String sname = "son";

       private int sage = 20;

       public String getSname() {

              return sname;

       }

       public void setSname(String sname) {

              this.sname = sname;

       }

       public int getSage() {

              return sage;

       }

       public void setSage(int sage) {

              this.sage = sage;

       }

}

 

 

4.請說明如何獲得一個類(Class)的方法,以及如何調用這些方法?

package reflect;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class Demo3 {

       public void show() {

              System.out.println("show method");

       }

       public void show(int i) {

              System.out.println("show method with param :" + i);

       }

       public int showReturn() {

              return 1;

       }

       public static void main(String[] args) {

              try {

                     Class class1 = Class.forName("reflect.Demo3");

                     Demo3 demo3 = (Demo3) class1.newInstance();

                     Method method1 = demo3.getClass().getDeclaredMethod("show");

                     Method method2 = demo3.getClass().getDeclaredMethod("show", int.class);

                     Method method3 = demo3.getClass().getDeclaredMethod("showReturn");

                     method1.invoke(demo3);

                     method2.invoke(demo3, 2);

                     Integer i = (Integer)method3.invoke(demo3);

                     System.out.println(i);

              } catch (ClassNotFoundException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (InstantiationException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (IllegalAccessException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (SecurityException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (NoSuchMethodException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (IllegalArgumentException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              } catch (InvocationTargetException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              }

       }

}

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