什麼是Java 反射(reflect)
Java反射是Java被視爲動態(或準動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection API取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的所有信息,並可於運行時改變fields內容或喚起methods。
Java反射機制允許程序在運行時加載、探知、使用編譯期間完全未知的classes。
換言之,Java可以加載一個運行時才得知名稱的class,獲得其完整結構
如果實現類的Reflect 呢?
通過類的Class 對象。 運行時類想引入其他類對象 這時就要使用類的Class對象。如何獲取類的Class對象呢? 有四種方法,常用的三種
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { /** * @param args */ public static void main(String[] args) { Class c; try { // 獲取類的Class對象有三種方式 其實也就是獲取Reflect // 第一種方式 使用靜態方法 forName c = Class.forName("User"); // 第二種方法 // c = User.class; //第三種方法 // User user = new User(); // c = user.getClass(); Object obj = c.newInstance(); Method m1=c.getMethod("say");//找到名字叫做say、且無參的方法 Method m2=c.getMethod("say",String.class);//找到名字叫做say、且有一個String類型參數的方法 Method m3=c.getMethod("setName",String.class); Method m4=c.getMethod("getName"); m3.invoke(obj, "zlm"); m4.invoke(obj); m1.invoke(obj);//注意newInstance()調用的是無參的構造方法!!! m2.invoke(c.getConstructor(String.class).newInstance("zlm"),"哈哈");//通過有參的構造方法實例化一個對象 System.out.println("-----------------------------------獲取Reflect屬性-------------------------"); // c.getField("name"); Object object = c.newInstance(); // 這是本例的事例對象 c.getField("pas").set(object, "zlmwin"); Field field = c.getDeclaredField("name"); field.setAccessible(true); field.set(object, "win0701"); System.out.println(field.get(object)); System.out.println(c.getField("pas")); System.out.println(c.getField("pas").get(object)); Field[] field1 = c.getFields(); for(Field fi:field1){ System.out.println("============fi========>" + fi); } Field[] field2 = c.getDeclaredFields(); for(Field fe:field2){ System.out.println("-=-=-=-=-=-=fe-=-=-=-=-=<>" + fe); System.out.println("-------------------賦值開始----------------" + fe.toString().trim().startsWith("public", 0)); if(fe.toString().startsWith("public", 0)){ System.out.println("99999999999999"); fe.set(object, "public"); System.out.println(fe.get(object)); }else{ fe.setAccessible(true); fe.set(object, "private"); System.out.println(fe.get(object)); } System.out.println("-------------------賦值結束----------------"); System.out.println("==================================Field測試結束===================="); System.out.println("==================================方法 test start===================="); // //Method me = c.getMethod("info"); // //Method me = c.getMethod("login", String.class); // Method me = c.getDeclaredMethod("login", String.class); // me.setAccessible(true); // me.invoke(object, "小丁"); // System.out.println("-----------------------------"); // Method[] me1 = c.getMethods(); // for(Method mh:me1){ // System.out.println("---???--->" + mh + "----" + mh.hashCode()); // // } // Method method = c.getMethod("getName"); // method.invoke(object); } System.out.println("----------------構造方法----------------------"); Constructor con = c.getConstructor(String.class); c.newInstance(); User user= (User)con.newInstance("小丁丁"); user.say(); user.say("liming"); System.out.println("ppppppp......" + con); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }//通過反射找到對應的類 } }
User 類
class User { private String name; public String pas; public static String id; public void setName(String name){ this.name = name; System.out.println("-----------"+this.name); } public String getName(){ System.out.println("---+--------"+this.name); return this.name; } public User(){ System.out.println("無參構造方法"); } public User(String name) { System.out.println("----------------============" + name); this.name=name; } public void say()//無參的方法 { System.out.println("大家好,我叫"+this.name+"!"); } public void say(String str)//有參的方法 { System.out.println("大家好,我叫"+name+"!"+str+",我是有參的方法!"); } @SuppressWarnings("unused") private void login(String name){ this.name = name; System.out.println("私有方法---------------->" + name); } public static void info(){ System.out.println("靜態方法"); } }