問:下面程序段注釋部分運行結果分別是什么纺念?為什么拷泽?
public class Test {
public void age(int age) {
System.out.println("int age="+age);
}
public void age(Integer age) {
System.out.println("Integer age="+age);
}
public static void main(String[] args) throws Exception {
Test obj = new Test();
Method m1 = obj.getClass().getMethod("age", int.class);
m1.invoke(obj, new Integer(27)); //1
m1.invoke(obj, 28); //2
Method m2 = obj.getClass().getMethod("age", Integer.class);
m2.invoke(obj, new Integer(27)); //3
m2.invoke(obj, 28); //4
Method m3 = obj.getClass().getMethod("age", Integer.TYPE);
m3.invoke(obj, new Integer(27)); //5
m3.invoke(obj, 28); //6
}
}
答:上面程序的運行結果如下州邢。
int age=27
int age=28
Integer age=27
Integer age=28
int age=27
int age=28
因為在反射中基本類型的 class 和其對應包裝類的 class 是不同的,所以在獲得 Method 指定參數時需要精確指定參數的類型辙诞,即基本類型參數 int 是無法使用包裝類型 Integer 來獲得的辙售,在 Java 反射中一定要注意這個問題。
這個問題中想反射調用基本類型參數方法除了可以通過 基本類型名.class
外還可以通過 對應包裝類的靜態(tài)字段 TYPE
獲得飞涂,即通過調用 getMethod("age", Integer.TYPE).invoke(27);
來實現反射 int 類型的 age 方法旦部,因為 int.class
等價于 Integer.TYPE
。
該問題的本質其實是因為 Java 中一切皆對象较店,而基本數據類型沒有類的全限定名且沒有 getClass 方法可供使用士八,所以如果想用 Class 類來表示基本數據類型的 Class 實例就得使用 Java 提供的內置實例,即:
Class clzss = byte.class;
Class clzss = short.class;
Class clzss = int.class;
Class clzss = long.class;
Class clzss = char.class;
Class clzss = float.class;
Class clzss = double.class;
Class clzss = boolean.class;
Class clzss = void.class;
此外 Java 的基本數據類型的包裝類中都有一個名為 TYPE 的常量來表示對應包裝類型的基本數據類型的 Class 實例梁呈,即:
Byte.TYPE = byte.class;
Short.TYPE = short.class;
Integer.TYPE = int.class;
Long.TYPE = long.class;
Char.TYPE = char.class;
Float.TYPE = float.class;
Double.TYPE = double.class;
Boolean.TYPE = boolean.class;
Void.TYPE = void.class;
結論:包裝類.TYPE = 基本數據類型.class
同理對于數組類型的 Class 類型實例也是類似規(guī)則婚度,譬如:
Class clzss = int[].class; //int[] 數組
Class clzss = String[].class; //String[] 數組
Class clzss = String[][].class; //String[][] 數組的數組