Java反射

Java反射

概述

  1. Java反射機(jī)制可以讓我們?cè)诰幾g期(Compile Time)之外的運(yùn)行期(Runtime)檢查類慧库,接口,變量以及方法的信息虑啤。
  2. 反射還可以讓我們?cè)谶\(yùn)行期實(shí)例化對(duì)象,調(diào)用方法,通過(guò)調(diào)用get/set方法獲取變量的值, 即使方法或字段是私有的的也可以通過(guò)反射的形式調(diào)用

使用場(chǎng)景:

  1. 在某些情況下酪捡,我們要使用的類在運(yùn)行時(shí)才能確定,但是這個(gè)類符合某種特定的規(guī)范纳账,例如JDBC逛薇。因?yàn)槲覀儫o(wú)法在編譯期就使用它,所以只能通過(guò)反射來(lái)使用運(yùn)行時(shí)才存在的類疏虫。
  2. 我們對(duì)于類的內(nèi)部信息不可知永罚,必須要等到運(yùn)行時(shí)才能獲取類的具體信息啤呼。比如ORM框架,在運(yùn)行時(shí)才能夠獲取類中的各個(gè)字段呢袱,然后通過(guò)反射的形式獲取其字段名和值官扣,存入數(shù)據(jù)庫(kù)。
  3. 注解相關(guān)羞福。例如JUnit惕蹄,使用反射來(lái)判斷類中的方法是否有@Test注解,來(lái)運(yùn)行單元測(cè)試治专。

Class對(duì)象

當(dāng)我們編寫(xiě)完一個(gè)Java項(xiàng)目之后,所有的Java文件都會(huì)被編譯成一個(gè).class文件卖陵,這些Class對(duì)象承載了這個(gè)類型的父類、接口看靠、構(gòu)造函數(shù)赶促、方法、成員變量等原始信息挟炬,這些class文件在程序運(yùn)行時(shí)會(huì)被ClassLoader加載到虛擬機(jī)中鸥滨。當(dāng)一個(gè)類被加載以后,Java虛擬機(jī)就會(huì)在內(nèi)存中自動(dòng)產(chǎn)生一個(gè)Class對(duì)象谤祖。我們通過(guò)new的形式創(chuàng)建對(duì)象實(shí)際上就是通過(guò)這些Class來(lái)創(chuàng)建,只是這個(gè)過(guò)程對(duì)于我們是不透明的而已婿滓。

在你想檢查一個(gè)類的信息之前,你首先需要獲取類的Class對(duì)象粥喜。Java中的所有類型包括基本類型(int, long, float等等)凸主,即使是數(shù)組都有與之關(guān)聯(lián)的Class類的對(duì)象。有三種方式來(lái)獲取一個(gè)類的Class對(duì)象额湘。

  1. 如果在編譯期就知道類的名稱卿吐,可以使用類字面量(class-literal)來(lái)獲取Class對(duì)象,Foo.class锋华。
Class myObjectClass = MyObject.class;
  1. 如果已經(jīng)得到一個(gè)對(duì)象嗡官,可以通過(guò)對(duì)象的object.getClass()方法獲取Class對(duì)象。
TestClass testClass = new TestClass();
Class<?> clazz = testClass.getClass();
  1. 如果在編譯期獲取不到目標(biāo)類型毯焕,但是在知道它的完整類路徑(全類名)衍腥,那么可以通過(guò)Class.forName()方法來(lái)獲取Class對(duì)象。
Class<?> clazz = Class.forName("com.example.TestClass");

Class對(duì)象的一些方法

基本方法

  1. String name = clazz.getName() 獲取類的全類名(包括包信息)
  2. String simpleName = clazz.getSimpleName() 獲取類名
  3. Package package = clazz.getPackage() 獲取包信息
  4. Class superClass = clazz.getSuperclass() 獲取父類的Class對(duì)象
  5. Class[] interfaces = clazz.getInterfaces() 獲取類所實(shí)現(xiàn)的接口集合
    getInterfaces() 返回的僅僅只是當(dāng)前類所實(shí)現(xiàn)的接口纳猫,不包括父類實(shí)現(xiàn)的接口
  6. int modifiers = clazz.getModifiers() 返回類修飾符
    每個(gè)修飾符都是一個(gè)位標(biāo)識(shí)(flag bit)婆咸,將這些修飾符封裝成一個(gè)int類型的值∥咴可以通過(guò)java.lang.Modifier類中的方法來(lái)檢查修飾符的類型尚骄。
    Modifier.isAbstract(int modifiers);
    Modifier.isFinal(int modifiers);
    Modifier.isInterface(int modifiers);
    Modifier.isNative(int modifiers);
    Modifier.isPrivate(int modifiers);
    Modifier.isProtected(int modifiers);
    Modifier.isPublic(int modifiers);
    Modifier.isStatic(int modifiers);
    Modifier.isStrict(int modifiers);
    Modifier.isSynchronized(int modifiers);
    Modifier.isTransient(int modifiers);
    Modifier.isVolatile(int modifiers);
    
    或者可以通過(guò)Modifier.toString(int mod)靜態(tài)方法輸出類修飾符物遇。

構(gòu)造器

  1. Constructor<?>[] getConstructors()
  2. Constructor<T> getConstructor(Class<?>... parameterTypes)
  3. Constructor<?>[] getDeclaredConstructors()
  4. Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

通過(guò)方法簽名應(yīng)該很容易看出來(lái)憾儒,有參數(shù)的方法是通過(guò)構(gòu)造器的參數(shù)類型獲取唯一的構(gòu)造器乃沙,沒(méi)有參數(shù)的是獲取類所有的構(gòu)造函數(shù)起趾。帶有Declared的是獲取類自身所有的構(gòu)造函數(shù),public训裆、default蜀铲、protected和private的边琉。而不帶Declared則只返回public的構(gòu)造函數(shù)。

方法

  1. Method[] getMethods()
  2. Method getMethod(String name, Class<?>... parameterTypes)
  3. Method[] getDeclaredMethods()
  4. Method getDeclaredMethod(String name, Class<?>... parameterTypes)

和獲取構(gòu)造函數(shù)的方法類似记劝,不過(guò)帶有Declared的是獲取自身所有的方法变姨,不包括從父類中繼承的厌丑。而不帶Declared的則返回該類所有public的方法,包括從父類中繼承下來(lái)的砍鸠。其中耕驰,參數(shù)name為方法的名稱,parameterTypes為參數(shù)的類型朦肘。

成員變量

  1. Field[] getFields()
  2. Field getField(String name)
  3. Field[] getDeclaredFields()
  4. Field getDeclaredField(String name)

這個(gè)和獲取方法的差不多,帶有Declared的是獲取自身所有的成員變量示启,不包括從父類中繼承的领舰。而不帶Declared的則返回該類所有public的成員變量迟螺,包括從父類中繼承下來(lái)的。其中矩父,參數(shù)name為成員變量的名稱。

注解

  1. Annotation[] getAnnotations()
  2. <A extends Annotation> A getAnnotation(Class<A> annotationClass)
  3. Annotation[] getDeclaredAnnotations()
  4. <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass)

和獲取方法的差不多民轴。annotationClass為注解的Class對(duì)象。注意瑰钮,getDeclaredAnnotation(Class<A> annotationClass)方法是Java8新添加的方法

Constructor對(duì)象

利用Java的反射機(jī)制你可以檢查一個(gè)類的構(gòu)造方法微驶,并且可以在運(yùn)行期創(chuàng)建一個(gè)對(duì)象浪谴。這些功能都是通過(guò)java.lang.reflect.Constructor這個(gè)類實(shí)現(xiàn)的因苹。

首先展示我們測(cè)試用的類。

public class Student {
    @MyAnnotation(name = "annotation")
    private int age;
    private List<String> parent;

    public Student(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    @MyAnnotation(name = "annotation")
    public void setAge(@MyAnnotation(name = "annotation") int age) {
        this.age = age;
    }

    public List<String> getParent() {
        return parent;
    }

    public void setParent(List<String> parent) {
        this.parent = parent;
    }
}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String name();
}

利用Contructor對(duì)象實(shí)例化一個(gè)類

方法定義:T newInstance(Object ... initargs)

代碼如下:

Class<Student> clazz = Student.class;
// 獲得一個(gè)Contructor對(duì)象扶檐,參數(shù)類型為int
Constructor<Student> constructor = clazz.getConstructor(int.class);

int age = 5;
// 利用Contructor對(duì)象示例化一個(gè)實(shí)例
Student student = constructor.newInstance(age);
System.out.println("student's age is :" + student.getAge()); // 打印出 student's age is :5

Method對(duì)象

使用Java反射你可以在運(yùn)行期檢查一個(gè)方法的信息以及在運(yùn)行期調(diào)用這個(gè)方法款筑,通過(guò)使用java.lang.reflect.Method類就可以實(shí)現(xiàn)上述功能。

通過(guò)Method對(duì)象調(diào)用方法

方法定義:Object invoke(Object obj, Object... args)

參數(shù)obj為調(diào)用方法的實(shí)例對(duì)象醋虏,如果方法是靜態(tài)方法,則objnull颈嚼。參數(shù)args是原方法的參數(shù)。
如果方法的返回值為void叫挟,則invoke的返回值為null限煞。

代碼如下:

Method setMethod = clazz.getMethod("setAge", int.class);
int anotherAge = 20;
// 通過(guò)invoke調(diào)用方法,參數(shù)1為對(duì)象實(shí)例署驻,如果該方法為靜態(tài)方法,則傳null瓶蚂。接下來(lái)的參數(shù)是原方法的參數(shù)宣吱。
setMethod.invoke(student, anotherAge);

Method getMethod = clazz.getMethod("getAge");
Object result = getMethod.invoke(student);
System.out.println("student's age is :" + result); // 打印出 student's age is :20

通過(guò)Method對(duì)象獲取方法參數(shù)以及返回類型

  1. Class<?>[] getParameterTypes() 獲取方法所有的參數(shù)類型
  2. Class<?> getReturnType() 獲取方法的返回類型

代碼如下:

// 獲取方法所有的參數(shù)類型
Class[] parameterTypes = setMethod.getParameterTypes();
for (Class parameterType : parameterTypes) {
    System.out.println(parameterType); // 打印出int
}
// 獲取方法的返回類型
Class returnType = setMethod.getReturnType();
System.out.println(returnType);  // 打印出void

通過(guò)Method對(duì)象獲取泛型參數(shù)類型和泛型返回類型

  1. Type getGenericReturnType() 獲取泛型返回類型
  2. Type[] getGenericParameterTypes() 獲取泛型參數(shù)類型

上文說(shuō)的getReturnTypegetParameterTypes返回的值原始類型(raw type),無(wú)法獲得泛型類型杭攻。而getGenericReturnTypegetGenericParameterTypes可以返回參數(shù)化類型。當(dāng)然兆解,如果方法本身返回的不是參數(shù)化類型,那么這兩個(gè)方法和getReturnType等效果相同叼架。

首先衣撬,我們先科普一下Type接口。

Type is the common superinterface for all types in the Java
programming language. These include raw types, parameterized types,
array types, type variables and primitive types.

  • raw types : 例如 List
  • parameterized types : 例如 List<String>
  • array types : 例如 String[]
  • type variables : 例如 interface List<E> 中的E
  • primitive types : 例如 int

然后我們來(lái)看一下代碼:

Method getParentMethod = clazz.getMethod("getParent");
Type returnType = getParentMethod.getGenericReturnType();

if (returnType instanceof ParameterizedType) {
    // 將returnType轉(zhuǎn)化為子類ParameterizedType具练。此時(shí)的parameterizedType為L(zhǎng)ist<String>
    ParameterizedType parameterizedType = (ParameterizedType) returnType;

    // 通過(guò)getActualTypeArguments方法獲取泛型類型。此時(shí)為String
    Type[] typeArgs = parameterizedType.getActualTypeArguments();
    for (Type typeArg : typeArgs) {
        System.out.println(typeArg); // 打印出 String
    }
}

上述代碼以getGenericReturnType方法為例哥遮,getGenericParameterTypes方法是類似的陵究。通過(guò)getGenericReturnType返回的是整個(gè)參數(shù)化類型,如代碼中的List<String>铜邮。通過(guò)ParameterizedTypegetActualTypeArguments方法返回的才是泛型里的參數(shù)類型,如List<String>中的String扔茅。

通過(guò)Method對(duì)象獲取方法注解

  1. Annotation[] getAnnotations()
  2. <T extends Annotation> T getAnnotation(Class<T> annotationClass)
  3. Annotation[] getDeclaredAnnotations()

獲取方法注解和獲取類注解類似秸苗,下面我們看一下示例:

Class<Student> clazz = Student.class;
Method method = clazz.getDeclaredMethod("setAge", int.class);

MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
System.out.println(annotation.name()); // 打印出annotation

通過(guò)Method對(duì)象獲取參數(shù)注解

  1. Annotation[][] getParameterAnnotations() 返回一個(gè)二維數(shù)組,每一個(gè)方法的參數(shù)包含一個(gè)注解數(shù)組

示例代碼如下:

Annotation[][] parameterAnnotations = method.getParameterAnnotations();
// 遍歷獲得各個(gè)參數(shù)的注解數(shù)組
for (Annotation[] annotations : parameterAnnotations) {
    // 遍歷注解數(shù)組玖瘸,獲取每個(gè)注解
    for (Annotation annotation : annotations) {
        if (annotation instanceof MyAnnotation) {
            MyAnnotation myAnnotation = (MyAnnotation) annotation;
            System.out.println(myAnnotation.name()); // 打印出annotation
        }
    }
}

Field對(duì)象

使用Java反射機(jī)制你可以運(yùn)行期檢查一個(gè)類的變量信息(成員變量)或者獲取或者設(shè)置變量的值檀咙。通過(guò)使用java.lang.reflect.Field類就可以實(shí)現(xiàn)上述功能。

獲取或設(shè)置(get/set)變量值

  1. Object get(Object obj) 獲取成員變量的值攀芯,參數(shù)obj為對(duì)象實(shí)例文虏,如果是靜態(tài)成員變量殖演,則傳入null即可年鸳。
  2. void set(Object obj, Object value) 設(shè)置成員變量的值,參數(shù)obj為對(duì)象實(shí)例彼棍,如果是靜態(tài)成員變量膳算,則傳入null即可。value為欲設(shè)置的值涕蜂。

除了上訴兩個(gè)方法,Field類還提供了獲取和設(shè)置基礎(chǔ)類型的方法蜘拉。例如setBoolean有鹿、getBoolean等方法。

代碼示例如下:

Class<Student> clazz = Student.class;
Field ageField = clazz.getDeclaredField("age");

Student student = new Student(15);
// 通過(guò)get方法獲取成員變量的值
Object age = ageField.get(student);
System.out.println(age); // 輸出15

// 通過(guò)set方法設(shè)置成員變量的值
ageField.set(student, 20);
System.out.println(ageField.get(student)); // 輸出20

通過(guò)Field對(duì)象獲取成員變量的泛型參數(shù)類型

  1. Type getGenericType() 獲取帶泛型參數(shù)的成員變量類型(即List<String>,而不僅僅是raw type)

和Method對(duì)象的方法類似持寄,獲取的Type是ParameterizedType年局,強(qiáng)轉(zhuǎn)之后,通過(guò)ParameterizedType的getActualTypeArguments()方法可以獲取成員變量實(shí)際的泛型參數(shù)類型矢否。

代碼示例如下:

Class<Student> clazz = Student.class;
Field parentField = clazz.getDeclaredField("parent");

Type type = parentField.getGenericType();
if (type instanceof ParameterizedType) {
    ParameterizedType parameterizedType = (ParameterizedType) type;
    Type[] typeArgs = parameterizedType.getActualTypeArguments();
    for (Type typeArg : typeArgs) {
        System.out.println(typeArg); // 輸出class java.lang.String
    }
}

通過(guò)Field對(duì)象獲取注解

  1. Annotation[] getAnnotations()
  2. <T extends Annotation> T getAnnotation(Class<T> annotationClass)
  3. Annotation[] getDeclaredAnnotations()

和Method的方法類似僵朗。示例如下:

Field ageField = clazz.getDeclaredField("age");
MyAnnotation myAnnotation = ageField.getAnnotation(MyAnnotation.class);
System.out.println(myAnnotation.name()); // 打印出annotation

AnnotatedElement接口

上文中我們介紹了通過(guò)Class,Constructor,Method,Field來(lái)獲取注解,可以觀察到他們調(diào)用的方法都是相同的验庙,因?yàn)樗麄兌紝?shí)現(xiàn)了AnnotatedElement接口。

首先我們看一下文檔:

Represents an annotated element of the program currently running in this
VM. This interface allows annotations to be read reflectively. All
annotations returned by methods in this interface are immutable and
serializable. The arrays returned by methods of this interface may be modified
by callers without affecting the arrays returned to other callers.

該接口表示當(dāng)前運(yùn)行在VM的程序中悴了,被注解標(biāo)注的元素,這就要求該注解的RetentionRetentionPolicy.RUNTIME湃交。當(dāng)然這個(gè)接口位于java.lang.reflect包中,所以當(dāng)然是為了反射而存在的咯息罗。而且接口中方法返回的注解都是不可變的(immutable)才沧,所以不用擔(dān)心因?yàn)樽⒔庠谶\(yùn)行時(shí)被改變影響到其它代碼。

接下來(lái)我們看一下接口的幾個(gè)方法:

  1. boolean isAnnotationPresent(Class<? extends Annotation> annotationClass): 判斷該類型的注解是否存在温圆。
  2. <T extends Annotation> T getAnnotation(Class<T> annotationClass): 根據(jù)注解類型返回該AnnotatedElement上的注解捌木,如果不存在,則返回null刨裆。
  3. Annotation[] getAnnotations() : 返回所有的注解,如果沒(méi)有注解存在帆啃,則返回空數(shù)組。
  4. Annotation[] getDeclaredAnnotations() : 返回所有的注解诽偷,不包括從父類中繼承來(lái)的疯坤,如果注解不存在,則返回空數(shù)組压怠。

Java8以前的注解不允許重復(fù)出現(xiàn)相同類型的注解,但是Java8可以通過(guò)元注解@Repeatable來(lái)表示一個(gè)注解是可重復(fù)出現(xiàn)的蜗顽,所以AnnotatedElement接口又添加了幾個(gè)和重復(fù)注解相關(guān)的方法雨让。

  1. <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass): 返回所有同一種類型的注解。如果不存在崔挖,則返回空數(shù)組贸街。
  2. <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass): 返回所有同一種類型的注解狸相,不包括從父類繼承來(lái)的卷哩。如果不存在,則返回空數(shù)組将谊。
  3. <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass): 根據(jù)注解類型返回注解渐白,不包括從父類中繼承來(lái)的。如果不存在纯衍,返回null。這個(gè)和重復(fù)注解沒(méi)關(guān)系瓦堵,但也是Java8中添加的新方法歌亲。

參考資料

公共技術(shù)之 Java反射 Reflection

Java Reflection教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惋鸥,隨后出現(xiàn)的幾起案子悍缠,更是在濱河造成了極大的恐慌,老刑警劉巖飞蚓,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玷坠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡八堡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門缝龄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瞎饲,你說(shuō)我怎么就攤上這事炼绘。” “怎么了俺亮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)东且。 經(jīng)常有香客問(wèn)我本讥,道長(zhǎng),這世上最難降的妖魔是什么拷沸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任堵漱,我火速辦了婚禮,結(jié)果婚禮上勤庐,老公的妹妹穿的比我還像新娘。我一直安慰自己米罚,他們只是感情好丈探,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著碗降,像睡著了一般。 火紅的嫁衣襯著肌膚如雪动看。 梳的紋絲不亂的頭發(fā)上爪幻,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天须误,我揣著相機(jī)與錄音仇轻,去河邊找鬼。 笑死祭椰,一個(gè)胖子當(dāng)著我的面吹牛疲陕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸭轮,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼橄霉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了按厘?” 一聲冷哼從身側(cè)響起钱慢,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎懒棉,沒(méi)想到半個(gè)月后览绿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饿敲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年怀各,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓢对。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沥曹,死狀恐怖碟联,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲤孵,我是刑警寧澤辰如,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站凯正,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏廊散。R本人自食惡果不足惜梧疲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缭受。 院中可真熱鬧该互,春花似錦、人聲如沸宇智。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)太防。三九已至,卻和暖如春蜒车,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酿愧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工嬉挡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汇恤,地道東北人拔恰。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颜懊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匠璧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一咸这、概述 1、Java反射機(jī)制(Java-Reflect): 在運(yùn)行狀態(tài)中裁厅,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類中的所...
    年少懵懂丶流年夢(mèng)閱讀 4,434評(píng)論 0 5
  • 前言 現(xiàn)在在我們構(gòu)建自己或公司的項(xiàng)目中,或多或少都會(huì)依賴幾個(gè)流行比較屌的第三方庫(kù)唠梨,比如:Butter Knife侥啤、...
    戴定康閱讀 3,940評(píng)論 0 17
  • 1.反射含義是什么? Java反射機(jī)制是指在運(yùn)行狀態(tài)中盖灸,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法醉箕;對(duì)于任意...
    Marlon666閱讀 395評(píng)論 0 0
  • 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以讓我們?cè)谶\(yùn)行時(shí)獲取類的函數(shù)徙垫、...
    Ten_Minutes閱讀 541評(píng)論 0 4
  • 一、概述 Java反射機(jī)制定義 Java反射機(jī)制是在運(yùn)行狀態(tài)中己英,對(duì)于任意一個(gè)類吴旋,都能夠知道這個(gè)類中的所有屬性和方法...
    CoderZS閱讀 1,642評(píng)論 0 26