通過字串建立物件並訪問類中的方法(利用java的反射)
首先,通過字串建立物件,也就是說同一個包下有好多xxxclass.java檔案,這些檔案中都有相同的屬性和方法,那麼問題是如何通過我傳入字串來建立對應的物件並訪問其中的方法屬性等
先來簡單說一下什麼是反射?
----能夠分析類能力的程式----
下面進入正題:建立物件
假如在src下demo 的pacage裡有demo1class.java, demo2class.java, demo3class.java, demo4class.java,四個檔案,每個檔案內容如下(都有proprty,id兩個屬性,getId()和getName()兩個方法):
package demo;
public class demo2class {
private String proprety = null;
private int id = 1;
public void getId(){
System.out.println("getId():demo2class");
}
public void getName(){
System.out.println("getName():demo2class");
}
}
下面是main方法的實現:
package demo;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
public class demo {
public static void main (String arg []) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
String className="demo2"+"class";
Class<?> clazz = Class.forName("demo."+className);
// 呼叫demo2class類中的getId方法
Method method = clazz.getMethod("getId");
method.invoke(clazz.newInstance());
// Java 反射機制 - 呼叫某個類的方法1.
// 呼叫demo2class的getName方法
method = clazz.getMethod("getName");
method.invoke(clazz.newInstance());
try {
Field f=clazz.getDeclaredField("id");
f.setAccessible(true);
//f.set(clazz.newInstance(), "java");
Object o= f.get(clazz.newInstance());
System.out.println(o.toString());
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
根據字串建立物件,用java反射中的Class.forName(”包路徑”);通過呼叫靜態方法forName或得類名對應的Class物件。
例如:String className = “java.until.Date”;
Class clazz= Class.forName(className);
1)呼叫類中方法用Method-----其中getMethods()方法獲取類中所有方法,帶引數的或得指定的方法。
clazz.newInstance()-----------快速的建立一個類的例項 (Class.forName(className).newInstance();和new差不多)
/ / 呼叫demo2class類中的getId方法
Method method = clazz.getMethod("getId");
method.invoke(clazz.newInstance());
// Java 反射機制 - 呼叫某個類的方法1.
2)呼叫類中屬性用Field---需要try 。。catch丟擲異常,當屬性是私有的時候需要f.setAccessible(true);
try {
Field f=clazz.getDeclaredField("id");
f.setAccessible(true);
//f.set(clazz.newInstance(), "java");
Object o= f.get(clazz.newInstance());
System.out.println(o.toString());
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}