1. 程式人生 > >java--反射機制總結

java--反射機制總結

pac cep facetype lena alt ise method 內部 per

一、什麽是Java反射機制?

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的以及動態調用對象的方法的功能稱為Java的反射機制。

二、反射機制提供了哪些功能?

  • 運行時判定任意一個對象所屬的類

  • 運行時構造任意一個類的對象;

  • 運行時判定任意一個類所具有的成員變量和方法;

  • 運行時調用任意一個對象的方法;

  • 生成動態代理;

三、class對象的獲取

    /**
     * 反射機制獲取類有三種方法
     */
    @Test
    public void
testGetClass() 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--反射機制總結