java--反射機制總結
一、什麽是Java反射機制?
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的以及動態調用對象的方法的功能稱為Java的反射機制。
二、反射機制提供了哪些功能?
-
在運行時判定任意一個對象所屬的類
-
在運行時構造任意一個類的對象;
-
在運行時判定任意一個類所具有的成員變量和方法;
-
在運行時調用任意一個對象的方法;
-
生成動態代理;
三、class對象的獲取
/** * 反射機制獲取類有三種方法 */ @Test public voidtestGetClass() throws ClassNotFoundException { Class clazz = null; //1 直接通過類名.Class的方式得到 clazz = Person.class; System.out.println("通過類名: " + clazz); //2 通過對象的getClass()方法獲取,這個使用的少(一般是傳的是Object,不知道是什麽類型的時候才用) Object obj = new Person(); clazz = obj.getClass(); System.out.println("通過getClass(): " + clazz); //3 通過全類名獲取,用的比較多,但可能拋出ClassNotFoundException異常 clazz = Class.forName("com.java.reflection.Person"); System.out.println("通過全類名獲取: " + clazz); }
四、反射機制能夠獲取哪些信息?Class類的API詳解。
1. 利用newInstance創建對象:調用的類必須有無參的構造器
1.1 通過字節碼對象創建實例對象(無參構造方法)
1.2 有參構造方法創建對象
總結上面創建實例對象:Class類的newInstance()方法是使用該類無參的構造函數創建對象;如果一個類沒有無參的構造函數, 就不能這樣創建了,可以調用Class類的getConstructor(String.class,int.class)方法獲取一個指定的構造函數然後再調用Constructor類的newInstance("張三",20)方法創建對象獲取全部構造方法;
2. 獲取類成員變量並使用--Field對象
2.1 獲取指定成員變量
Class.getField(String)方法可以獲取類中的指定字段(可見的), 如果是私有的可以用getDeclaedField("name")方法獲取,通過set(obj, "李四")方法可以設置指定對象上該字段的值, 如果是私有的需要先調用setAccessible(true)設置訪問權限,用獲取的指定的字段調用get(obj)可以獲取指定對象中該字段的值
2.2 獲取全部成員變量
3. 獲得方法並使用--Method對象
3.1 獲取指定方法
Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以獲取類中的指定方法,如果為私有方法,則需要打開一個權限。setAccessible(true);用invoke(Object, Object...)可以調用該方法,
3.2 一次性獲得所有的方法
五、class的摘要信息
boolean isPrimitive = class1.isPrimitive();//判斷是否是基礎類型 boolean isArray = class1.isArray();//判斷是否是集合類 boolean isAnnotation = class1.isAnnotation();//判斷是否是註解類 boolean isInterface = class1.isInterface();//判斷是否是接口類 boolean isEnum = class1.isEnum();//判斷是否是枚舉類 boolean isAnonymousClass = class1.isAnonymousClass();//判斷是否是匿名內部類 boolean isAnnotationPresent = class1.isAnnotationPresent(Deprecated.class);//判斷是否被某個註解類修飾 String className = class1.getName();//獲取class名字 包含包名路徑 Package aPackage = class1.getPackage();//獲取class的包信息 String simpleName = class1.getSimpleName();//獲取class類名 int modifiers = class1.getModifiers();//獲取class訪問權限 Class<?>[] declaredClasses = class1.getDeclaredClasses();//內部類 Class<?> declaringClass = class1.getDeclaringClass();//外部類 Annotation[] annotations = class1.getAnnotations();//獲取class對象的所有註解 Annotation annotation = class1.getAnnotation(Deprecated.class);//獲取class對象指定註解 Type genericSuperclass = class1.getGenericSuperclass();//獲取class對象的直接超類的 Type Type[] interfaceTypes = class1.getGenericInterfaces();//獲取class對象的所有接口的type集合
反射機制的優缺點:
優點:運行期類型的判斷,動態類加載,動態代理使用反射。
缺點:性能是一個問題,反射相當於一系列解釋操作,通知jvm要做的事情,性能比直接的java代碼要慢很多。
總結:Java的反射機制在平時的業務開發過程中很少使用到,但是在一些基礎框架的搭建上應用非常廣泛,今天簡單的總結學習了一下,還有很多未知的知識等以後用到再做補充。
java--反射機制總結