1反射機制是什么
反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
2反射機制能做什么
反射機制主要提供了以下功能:
-
在運行時判斷任意一個對象所屬的類;
-
在運行時構造任意一個類的對象;
-
在運行時判斷任意一個類所具有的成員變量和方法;
-
在運行時調用任意一個對象的方法;
-
生成動態代理。
3反射機制的相關API
通過一個對象獲得完整的包名和類名
package edu.pri.lime.test; public class TestReflect { public static void main(String[] args){ TestReflect reflect = new TestReflect(); // 通過一個對象獲得完整的包名和類名 System.out.println(reflect.getClass().getName()); } }
實例化Class類對象
package edu.pri.lime.test; public class TestReflect { public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazzA = Class.forName("edu.pri.lime.test.TestReflect"); Class<?> clazzB = new TestReflect().getClass(); Class<?> clazzC = TestReflect.class; System.out.println(clazzA.getName()); System.out.println(clazzB.getName()); System.out.println(clazzC.getName()); } }
獲取一個對象的父類與實現的接口
package edu.pri.lime.test; import java.io.Serializable; public class TestReflect implements Serializable{ private static final long serialVersionUID = -3407476067923921222L; public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect"); // 獲取父類 Class<?> clazzSup = clazz.getSuperclass(); System.out.println(clazzSup.getName()); // 獲取所有接口 Class<?> clazzInte[] = clazz.getInterfaces(); for(Class<?> in : clazzInte){ System.out.println(in.getName()); } } }
獲取某個類中的全部構造函數
package edu.pri.lime.test; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; public class TestReflect implements Serializable{ private static final long serialVersionUID = -3407476067923921222L; private int id; private String name; public TestReflect() { super(); // TODO Auto-generated constructor stub } public TestReflect(int id) { super(); this.id = id; } public TestReflect(String name) { super(); this.name = name; } public TestReflect(int id, String name) { super(); this.id = id; this.name = name; } public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect"); // 獲取所有構造函數 Constructor<?>[] constructors = clazz.getConstructors(); for(Constructor<?> con : constructors){ // 獲取構造函數所有參數類型 Class<?>[] paramTypes = con.getParameterTypes(); System.out.print(Modifier.toString(con.getModifiers()) + " "); System.out.print(con.getName() + "("); for(int i = 0;i < paramTypes.length;i++){ if(i < paramTypes.length - 1){ System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1) + ","); }else{ System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1)); } } System.out.println(");"); } } }