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) {
}catch(InstatiationException e1) {
e.printStackTrance();
}catch(IllegaAccessException e2) {
e.printStackTrance();
}
}
}
2.請說明如何獲得一個對象的類名、包名?
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),包括其父類的域。
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)的方法,以及如何調用這些方法?
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();
}
}
}