好吧,我知道這聽起來仍是很模糊,讓咱們一步一步來:java
Class a
public class MyClass { }
Class classInstance= MyClass.class;
二. 經過類建立的實例對象的getClass方法取得數組
MyClass myClass = new MyClass(); Class classInstance = myClass.getClass();
三.經過Class類的靜態方法forName方法取得(參數是帶包名的完整的類名)eclipse
Class classInstance = Class.forName("mypackage.MyClass");
try { Class classInstance = Class.forName("mypackage.MyClass"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
public class MyClass { private int value; //成員變量 public MyClass (int value) { this.value = value; } //構造函數 public int getValue() { return value; } //方法1 public void setValue(int value) { this.value = value; } //方法2 }
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void printClassMessage (Object obj) { Class c = obj.getClass(); // 獲取obj所屬類的Class對象
Method [] methods = c.getDeclaredMethods(); // 獲取方法對象列表
System.out.println("遍歷MyClass類裏的全部方法的名稱:"); for(int i =0; i<methods.length; i++) { System.out.println(methods[i].getName()); }
Field [] fields = c.getDeclaredFields(); // 獲取成員變量對象列表 System.out.println("遍歷MyClass類裏的全部成員變量的名稱:"); for(int i =0; i<fields.length; i++) { System.out.println(fields[i].getName()); } Constructor [] constructors = c.getConstructors(); // 獲取構造函數對象列表 System.out.println("遍歷MyClass類裏的全部構造函數的名稱:"); for(int i =0; i<constructors.length; i++) { System.out.println(constructors[i].getName()); } }
public static void main(String [] args) { MyClass myClass = new MyClass(1); // 建立一個MyClass對象 printClassMessage(myClass); // 打印這個對象所屬類的相關信息 } }
遍歷MyClass類裏的全部方法的名稱: getValue setValue 遍歷MyClass類裏的全部成員變量的名稱: value 遍歷MyClass類裏的全部構造函數的名稱: mypackage.MyClass
上面的例子僅僅是做爲一個展現,Method/Field/Constructor對象的API固然不只限於getName這樣獲取名稱的簡單操做,因此接下來我將分別介紹更具體的反射APIjvm
getValue setValue
import java.lang.reflect.Method; public class Test { public static void printMethodsMessage (Object obj) { Class c = obj.getClass(); Method [] methods = c.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } }
public static void main(String [] args) { MyClass myClass = new MyClass(1); printMethodsMessage(myClass); } }
getValue setValue wait wait wait equals toString hashCode getClass notify notifyAll
import java.lang.reflect.Method; public class Test { public static void printMethodsMessage (Object obj) { Class c = obj.getClass(); // 取得obj所屬類對應的Class對象 Method [] methods = c.getDeclaredMethods(); // 取得obj所屬類中方法對應的Method對象組成的數組 for (Method method : methods) { // 遍歷Method對象 String name = method.getName(); // 取得方法名 Class returnClass = method.getReturnType(); // 獲取方法返回值對應的Class對象 String returnName = returnClass.getName(); //獲取返回值所屬類的類名——也即返回值類型 System.out.println(name + "方法的返回值類型是" + returnName); } } public static void main(String [] args) { MyClass myClass = new MyClass(1); printMethodsMessage(myClass); }
}
getValue方法的返回值類型是int setValue方法的返回值類型是void
public class MyClass { public void method1 (int a, long b) { }; public void method2 (float a, double b) { }; public void method3 (String str) { }; }
public class Test { public static void printMethodsMessage (Object obj) { Class c = obj.getClass(); // 取得obj所屬類對應的Class對象 Method [] methods = c.getDeclaredMethods(); // 取得obj所屬類中方法對應的Method對象組成的數組 for (Method method : methods) { // 遍歷Method對象 String methodName = method.getName(); // 取得方法名 String paramsStr = ""; // 用於存放某個方法參數類型列表的字符串 Class [] paramsClasses = method.getParameterTypes(); for (Class pc: paramsClasses) { String paramStr = pc.getName(); // 獲取當前參數類型 paramsStr+=paramStr + " "; } System.out.println(methodName+ "方法的全部參數的類型列表:" + paramsStr); } }
public static void main(String [] args) { MyClass myClass = new MyClass(); printMethodsMessage(myClass); } }
method2方法的參數類型列表:float double method1方法的參數類型列表:int long method3方法的參數類型列表:java.lang.String
public class MyClass { private int number = 123; private String name ="彭湖灣"; }
import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void printFieldsMessage (Object obj) { Class c = obj.getClass(); // 取得obj所屬類對應的Class對象 try { Field field = c.getDeclaredField("name"); // 取得名稱爲name的field對象 field.setAccessible(true); // 這一步很重要!!!設置爲true才能訪問私有成員變量name的值! String nameValue = (String) field.get(obj); // 獲取obj中name成員變量的值 System.out.println("MyClass類中name成員變量的值爲:" + nameValue); // 輸出 } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
public static void main(String [] args) { MyClass myClass = new MyClass(); printFieldsMessage(myClass); }
}
MyClass類中name成員變量的值爲:彭湖灣
Field field = class1.getDeclaredField(number"); System.out.print(field.getType().getName());
int
public class MyClass { public MyClass(int a, String str){} }
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void printContructorsMessage (Object obj) { Class c = obj.getClass(); // 取得obj所屬類對應的Class對象 Constructor [] constructors = c.getDeclaredConstructors(); for (Constructor constructor : constructors) { Class [] paramsClasses = constructor.getParameterTypes(); String paramsStr = ""; for (Class pc : paramsClasses) { String paramStr = pc.getName(); paramsStr+=paramStr + " "; } System.out.println("構造函數的全部參數的類型列表:" + paramsStr); } } public static void main(String [] args) { MyClass myClass = new MyClass(1, "彭湖灣"); printContructorsMessage(myClass); }
}
構造函數的全部參數的類型列表:int java.lang.String
NotExistClass cannot be resolved to a type
Class classInstance = Class.forName("mypackage.MyClass"); MyClass myClass = (MyClass) classInstance.newInstance();
不過要注意的是,由於newInstance返回的是一個Object,因此要作強制類型轉換,將其變成MyClass類型函數
public class Test { public static void main(String [] args) { try { Class classInstance = Class.forName("mypackage.MyClass"); MyClass myClass = (MyClass) classInstance.newInstance(); } 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(); } } }
參考:利用反射實現JavaBean的自動賦值 import java.lang.reflect.Method; import java.util.*; import javax.servlet.http.HttpServletRequest; import com.sns.exception.ApplicationException; public final class ParameterUtil { public static void setFormBean(HttpServletRequest request, Object bean) { Class c = bean.getClass(); Method[] ms = c.getMethods(); for(int i=0; i<ms.length; i++) { String name = ms.getName(); if(name.startsWith("set")) { Class[] cc = ms.getParameterTypes(); if(cc.length==1) { String type = cc[0].getName(); // parameter type try { // get property name: String prop = Character.toLowerCase(name.charAt(3)) + name.substring(4); // get parameter value: String param = getString(request, prop); if(param!=null && !param.equals("")) { //ms.setAccessible(true); if(type.equals("java.lang.String")) { ms.invoke(bean, new Object[] {param}); } else if(type.equals("int") || type.equals("java.lang.Integer")) { ms.invoke(bean, new Object[] {new Integer(param)}); } else if(type.equals("long") || type.equals("java.lang.Long")) { ms.invoke(bean, new Object[] {new Long(param)}); } else if(type.equals("boolean") || type.equals("java.lang.Boolean")) { ms.invoke(bean, new Object[] { Boolean.valueOf(param) }); } else if(type.equals("java.util.Date")) { Date date = DateUtil.parseDateTime(param); if(date!=null) ms.invoke(bean, new Object[] {date}); } } } catch(Exception e) { e.printStackTrace(); } } } } } } 每當發現JavaBean中的setXxx()方法時,便自動尋找表單的對應字段xxx,若是找到,就利用反射調用此方法,將對應的字段值賦給JavaBean。 因爲表單傳遞的變量名和值所有是字符串,所以須要作某些轉換。目前,該程序能處理的數據類型包括:boolean,Boolean,int,Integer,long,Long,Date,不被支持的數據類型被自動忽略。你也能夠很方便地添加新的類型。 請 注意,只有public的set方法可以被調用。若是你但願private或protected的set方法也能被調用,請將紅色標識的 getMethods()改成getDeclaredMethods(),以便得到包括private和protected在內的全部方法,並將 ms.setAccessible(true);的註釋去掉,以便能正確調用private和protected方法。 反射是Java語言很是強大的功能,可是因爲反射會破壞對象封裝,而且反射調用的速度較慢,所以,只能在必要的工具類中使用。