【轉(zhuǎn)】公共技術(shù)點(diǎn)之 Java 反射 Reflection

項(xiàng)目:找前,分析者:Mr.Simple归形,校對(duì)者:Trinea
本文為 Android 開(kāi)源項(xiàng)目源碼解析 公共技術(shù)點(diǎn)中的 Java 反射 部分分析者:Mr.Simple邮府,校對(duì)者:Trinea单默,校對(duì)狀態(tài):未完成

1. 了解 Java 中的反射

1.1 什么是 Java 的反射

Java 反射是可以讓我們?cè)谶\(yùn)行時(shí)獲取類的函數(shù)抛猖、屬性魏颓、父類岭辣、接口等 Class 內(nèi)部信息的機(jī)制。通過(guò)反射還可以讓我們?cè)谶\(yùn)行期實(shí)例化對(duì)象甸饱,調(diào)用方法沦童,通過(guò)調(diào)用 get/set 方法獲取變量的值,即使方法或?qū)傩允撬接械牡囊部梢酝ㄟ^(guò)反射的形式調(diào)用叹话,這種“看透 class”的能力被稱為內(nèi)省偷遗,這種能力在框架開(kāi)發(fā)中尤為重要。 有些情況下驼壶,我們要使用的類在運(yùn)行時(shí)才會(huì)確定氏豌,這個(gè)時(shí)候我們不能在編譯期就使用它,因此只能通過(guò)反射的形式來(lái)使用在運(yùn)行時(shí)才存在的類(該類符合某種特定的規(guī)范热凹,例如 JDBC)泵喘,這是反射用得比較多的場(chǎng)景。還有一個(gè)比較常見(jiàn)的場(chǎng)景就是編譯時(shí)我們對(duì)于類的內(nèi)部信息不可知般妙,必須得到運(yùn)行時(shí)才能獲取類的具體信息纪铺。比如 ORM 框架,在運(yùn)行時(shí)才能夠獲取類中的各個(gè)屬性碟渺,然后通過(guò)反射的形式獲取其屬性名和值鲜锚,存入數(shù)據(jù)庫(kù)。這也是反射比較經(jīng)典應(yīng)用場(chǎng)景之一。

1.2 Class 類

那么既然反射是操作 Class 信息的芜繁,Class 又是什么呢?
這里寫圖片描述
這里寫圖片描述

當(dāng)我們編寫完一個(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ì)于我們是不透明的而已聪黎。下面的章節(jié)中我們會(huì)為大家演示反射的一些常用 api罕容,從代碼的角度理解反射。

2. 反射 Class 以及構(gòu)造對(duì)象

2.1 獲取 Class 對(duì)象

在你想檢查一個(gè)類的信息之前稿饰,你首先需要獲取類的 Class 對(duì)象锦秒。Java 中的所有類型包括基本類型,即使是數(shù)組都有與之關(guān)聯(lián)的 Class 類的對(duì)象喉镰。如果你在編譯期知道一個(gè)類的名字的話旅择,那么你可以使用如下的方式獲取一個(gè)類的 Class 對(duì)象。

Class<?> myObjectClass = MyObject.class;

如果你已經(jīng)得到了某個(gè)對(duì)象侣姆,但是你想獲取這個(gè)對(duì)象的 Class 對(duì)象生真,那么你可以通過(guò)下面的方法得到:

Student me = new Student("mr.simple");Class<?> clazz = me.getClass();

如果你在編譯期獲取不到目標(biāo)類型,但是你知道它的完整類路徑捺宗,那么你可以通過(guò)如下的形式來(lái)獲取 Class 對(duì)象:

Class<?> myObjectClass = Class.forName("com.simple.User");

在使用 Class.forName()方法時(shí)柱蟀,你必須提供一個(gè)類的全名,這個(gè)全名包括類所在的包的名字蚜厉。例如 User 類位于 com.simple 包长已,那么他的完整類路徑就是 com.simple.User。如果在調(diào)用 Class.forName()方法時(shí)弯囊,沒(méi)有在編譯路徑下(classpath)找到對(duì)應(yīng)的類痰哨,那么將會(huì)拋出 ClassNotFoundException。

接口說(shuō)明

  1. 加載指定的 Class 對(duì)象匾嘱,參數(shù) 1 為要加載的類的完整路徑斤斧,例如"com.simple.Student". ( 常用方式 )
public static Class<?> forName (String className)
  1. 加載指定的 Class 對(duì)象,參數(shù) 1 為要加載的類的完整路徑霎烙,例如"com.simple.Student";// 參數(shù) 2 為是否要初始化該 Class 對(duì)象撬讽,參數(shù) 3 為指定加載該類的 ClassLoader.
public static Class<?> forName (String className, boolean shouldInitialize, ClassLoader classLoader)

2.2 通過(guò) Class 對(duì)象構(gòu)造目標(biāo)類型的對(duì)象

一旦你拿到 Class 對(duì)象之后蕊连,你就可以為所欲為了!當(dāng)你善用它的時(shí)候它就是神兵利器游昼,當(dāng)你心懷鬼胎之時(shí)它就會(huì)變成惡魔甘苍。但獲取 Class 對(duì)象只是第一步,我們需要在執(zhí)行那些強(qiáng)大的行為之前通過(guò) Class 對(duì)象構(gòu)造出該類型的對(duì)象烘豌,然后才能通過(guò)該對(duì)象釋放它的能量载庭。 我們知道,在 java 中要構(gòu)造對(duì)象廊佩,必須通過(guò)該類的構(gòu)造函數(shù)囚聚,那么其實(shí)反射也是一樣一樣的。但是它們確實(shí)有區(qū)別的标锄,通過(guò)反射構(gòu)造對(duì)象顽铸,我們首先要獲取類的 Constructor(構(gòu)造器)對(duì)象,然后通過(guò) Constructor 來(lái)創(chuàng)建目標(biāo)類的對(duì)象料皇。還是直接上代碼的谓松。

private static void classForName() {
   try { 
      // 獲取 Class 對(duì)象 
      Class<?> clz = Class.forName("org.java.advance.reflect.Student"); 
      // 通過(guò) Class 對(duì)象獲取 Constructor,Student 的構(gòu)造函數(shù)有一個(gè)字符串參數(shù) 
      // 因此這里需要傳遞參數(shù)的類型 ( Student 類見(jiàn)后面的代碼 )
      Constructor<?> constructor = clz.getConstructor(String.class); 
      // 通過(guò) Constructor 來(lái)創(chuàng)建 Student 對(duì)象
      Object obj = constructor.newInstance("mr.simple"); 
      System.out.println(" obj : " + obj.toString()); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    }
 }

通過(guò)上述代碼践剂,我們就可以在運(yùn)行時(shí)通過(guò)完整的類名來(lái)構(gòu)建對(duì)象鬼譬。

獲取構(gòu)造函數(shù)接口
1)獲取一個(gè)公有的構(gòu)造函數(shù),參數(shù)為可變參數(shù)逊脯,如果構(gòu)造函數(shù)有參數(shù)拧簸,那么需要將參數(shù)的類型傳遞給 getConstructor 方法

public Constructor<T> getConstructor (Class...<?> parameterTypes)
  1. 獲取目標(biāo)類所有的公有構(gòu)造函數(shù)
public Constructor[]<?> getConstructors ()

注意,當(dāng)你通過(guò)反射獲取到 Constructor男窟、Method、Field 后贾富,在反射調(diào)用之前將此對(duì)象的 accessible 標(biāo)志設(shè)置為 true歉眷,以此來(lái)提升反射速度。值為 true 則指示反射的對(duì)象在使用時(shí)應(yīng)該取消 Java 語(yǔ)言訪問(wèn)檢查颤枪。值為 false 則指示反射的對(duì)象應(yīng)該實(shí)施 Java 語(yǔ)言訪問(wèn)檢查汗捡。例如 :

Constructor<?> constructor = clz.getConstructor(String.class); 
// 設(shè)置 Constructor 的 Accessible 
constructor.setAccessible(true); 

// 設(shè)置 Methohd 的 Accessible 
Method learnMethod = Student.class.getMethod("learn", String.class); 
learnMethod.setAccessible(true);

由于后面還會(huì)用到 Student 以及相關(guān)的類畏纲,我們?cè)谶@里就先給出它們的代碼吧扇住。
Person.java

public class Person { 
    String mName; 
    public Person(String aName) { 
        mName = aName; 
    } 
    private void sayHello(String friendName) { 
        System.out.println(mName + " say hello to " + friendName); 
    }
    protected void showMyName() { 
        System.out.println("My name is " + mName); 
    } 
    public void breathe() { 
        System.out.println(" take breathe "); 
    }
}

Student.java

public class Student extends Person implements Examination { 
    // 年級(jí) 
    int mGrade; 
    public Student(String aName) { 
        super(aName); 
    } 
    public Student(int grade, String aName) { 
        super(aName); mGrade = grade; 
    } 
    private void learn(String course) { 
        System.out.println(mName + " learn " + course); 
    } 
    public void takeAnExamination() {
        System.out.println(" takeAnExamination "); 
    } 
    public String toString() { 
        return " Student : " + mName; 
    }
}

Breathe.java

// 呼吸接口
public interface Breathe { 
  public void breathe();
}

Examination.java

// 考試接口
public interface Examination { 
    public void takeAnExamination();
}

3 反射獲取類中函數(shù)

3.1 獲取當(dāng)前類中定義的方法

要獲取當(dāng)前類中定義的所有方法可以通過(guò) Class 中的 getDeclaredMethods 函數(shù),它會(huì)獲取到當(dāng)前類中的 public盗胀、default艘蹋、protected、private 的所有方法票灰。而 getDeclaredMethod(String name, Class...<?> parameterTypes)則是獲取某個(gè)指定的方法女阀。代碼示例如下 :

private static void showDeclaredMethods() { 
    Student student = new Student("mr.simple"); 
    Method[] methods = student.getClass().getDeclaredMethods(); 
    for (Method method : methods) { 
        System.out.println("declared method name : " + method.getName()); 
    } 
    try { 
        Method learnMethod = student.getClass().getDeclaredMethod("learn", String.class); 
        // 獲取方法的參數(shù)類型列表 
        Class<?>[] paramClasses = learnMethod.getParameterTypes() ; 
        for (Class<?> class1 : paramClasses) { 
            System.out.println("learn 方法的參數(shù)類型 : " + class1.getName()); 
        }
         // 是否是 private 函數(shù)宅荤,屬性是否是 private 也可以使用這種方式判斷
         System.out.println(learnMethod.getName() + " is private " + Modifier.isPrivate(learnMethod.getModifiers())); 
         learnMethod.invoke(student, "java ---> "); 
    } catch (Exception e) { 
         e.printStackTrace(); 
    } 
}

3.2 獲取當(dāng)前類、父類中定義的公有方法

要獲取當(dāng)前類以及父類中的所有 public 方法可以通過(guò) Class 中的 getMethods 函數(shù)浸策,而 getMethod 則是獲取某個(gè)指定的方法冯键。代碼示例如下 :

private static void showMethods() { 
    Student student = new Student("mr.simple"); 
    // 獲取所有方法 Method[] methods = student.getClass().getMethods(); 
    for (Method method : methods) { 
        System.out.println("method name : " + method.getName()); 
    } 
    try { 
        // 通過(guò) getMethod 只能獲取公有方法,如果獲取私有方法則會(huì)拋出異常庸汗,比如這里就會(huì)拋異常 
        Method learnMethod = student.getClass().getMethod("learn", String.class); 
        // 是否是 private 函數(shù)惫确,屬性是否是 private 也可以使用這種方式判斷 
        System.out.println(learnMethod.getName() + " is private " + Modifier.isPrivate(learnMethod.getModifiers())); 
        // 調(diào)用 learn 函數(shù) learnMethod.invoke(student, "java"); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 
}

接口說(shuō)明

// 獲取 Class 對(duì)象中指定函數(shù)名和參數(shù)的函數(shù),參數(shù)一為函數(shù)名蚯舱,參數(shù) 2 為參數(shù)類型列表
public Method getDeclaredMethod (String name, Class...<?> parameterTypes)

// 獲取該 Class 對(duì)象中的所有函數(shù)( 不包含從父類繼承的函數(shù) )
public Method[] getDeclaredMethods ()

// 獲取指定的 Class 對(duì)象中的**公有**函數(shù)改化,參數(shù)一為函數(shù)名,參數(shù) 2 為參數(shù)類型列表
public Method getMethod (String name, Class...<?> parameterTypes)

// 獲取該 Class 對(duì)象中的所有**公有**函數(shù) ( 包含從父類和接口類集成下來(lái)的函數(shù) )
public Method[] getMethods ()

這里需要注意的是 getDeclaredMethod 和 getDeclaredMethods 包含 private晓淀、protected所袁、default、public 的函數(shù)凶掰,并且通過(guò)這兩個(gè)函數(shù)獲取到的只是在自身中定義的函數(shù)燥爷,從父類中集成的函數(shù)不能夠獲取到。而 getMethod 和 getMethods 只包含 public 函數(shù)懦窘,父類中的公有函數(shù)也能夠獲取到前翎。

4 反射獲取類中的屬性

獲取屬性和章節(jié) 3 中獲取方法是非常相似的,只是從 getMethod 函數(shù)換成了 getField畅涂,從 getDeclaredMethod 換成了 getDeclaredField 罷了港华。

4.1 獲取當(dāng)前類中定義的屬性

要獲取當(dāng)前類中定義的所有屬性可以通過(guò) Class 中的 getDeclaredFields 函數(shù),它會(huì)獲取到當(dāng)前類中的 public午衰、default立宜、protected、private 的所有屬性臊岸。而 getDeclaredField 則是獲取某個(gè)指定的屬性橙数。代碼示例如下 :

private static void showDeclaredFields() { 
    Student student = new Student("mr.simple"); 
    // 獲取當(dāng)前類的所公有屬性 
    Field[] publicFields = student.getClass().getDeclaredFields(); 
    for (Field field : publicFields) { 
        System.out.println("declared field name : " + field.getName()); 
    } 
    try { 
        // 獲取當(dāng)前類和父類的某個(gè)公有屬性 
        Field gradeField = student.getClass().getDeclaredField("mGrade"); 
        // 獲取屬性值 
        System.out.println(" my grade is : " + gradeField.getInt(student)); 
        // 設(shè)置屬性值 gradeField.set(student, 10); 
        System.out.println(" my grade is : " + gradeField.getInt(student)); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    }  
}

4.2 獲取當(dāng)前類、父類中定義的公有屬性

要獲取當(dāng)前類以及父類中的所有 public 屬性可以通過(guò) Class 中的 getFields 函數(shù)帅戒,而 getField 則是獲取某個(gè)指定的屬性灯帮。代碼示例如下 :

private static void showFields() { 
    Student student = new Student("mr.simple"); 
    // 獲取當(dāng)前類和父類的所有公有屬性 
    Field[] publicFields = student.getClass().getFields(); 
    for (Field field : publicFields) { 
        System.out.println("field name : " + field.getName()); 
    } 
    try { 
        // 獲取當(dāng)前類和父類的某個(gè)公有屬性 
        Field ageField = student.getClass().getField("mAge"); 
        System.out.println(" age is : " + ageField.getInt(student)); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 
}

接口說(shuō)明

// 獲取 Class 對(duì)象中指定屬性名的屬性,參數(shù)一為屬性名
public Method getDeclaredField (String name)

// 獲取該 Class 對(duì)象中的所有屬性( 不包含從父類繼承的屬性 )
public Method[] getDeclaredFields ()

// 獲取指定的 Class 對(duì)象中的**公有**屬性逻住,參數(shù)一為屬性名
public Method getField (String name)

// 獲取該 Class 對(duì)象中的所有**公有**屬性 ( 包含從父類和接口類集成下來(lái)的公有屬性 )
public Method[] getFields ()

這里需要注意的是 getDeclaredField 和 getDeclaredFields 包含 private钟哥、protected、default瞎访、public 的屬性腻贰,并且通過(guò)這兩個(gè)函數(shù)獲取到的只是在自身中定義的屬性,從父類中集成的屬性不能夠獲取到装诡。而 getField 和 getFields 只包含 public 屬性银受,父類中的公有屬性也能夠獲取到践盼。

5 反射獲取父類與接口

5.1 獲取父類

獲取 Class 對(duì)象的父類。

Student student = new Student("mr.simple"); 
Class<?> superClass = student.getClass().getSuperclass(); 
while (superClass != null) { 
    System.out.println("Student's super class is : " + superClass.getName());
    // 再獲取父類的上一層父類宾巍,直到最后的 Object 類咕幻,Object 的父類為 null 
    superClass = superClass.getSuperclass(); 
}

5.2 獲取接口

獲取 Class 對(duì)象中實(shí)現(xiàn)的接口。

private static void showInterfaces() { 
    Student student = new Student("mr.simple"); 
    Class<?>[] interfaceses = student.getClass().getInterfaces(); 
    for (Class<?> class1 : interfaceses) { 
        System.out.println("Student's interface is : " + class1.getName()); 
    } 
}

6 獲取注解信息

在框架開(kāi)發(fā)中顶霞,注解加反射的組合使用是最為常見(jiàn)形式的肄程。關(guān)于注解方面的知識(shí)請(qǐng)參考公共技術(shù)點(diǎn)之 Java 注解 Annotation,定義注解時(shí)我們會(huì)通過(guò)@Target 指定該注解能夠作用的類型选浑,看如下示例:

@Target({ 
    ElementType.METHOD, ElementType.FIELD, ElementType.TYPE }) 

@Retention(RetentionPolicy.RUNTIME) 
static @interface Test { }

上述注解的@target 表示該注解只能用在函數(shù)上蓝厌,還有 Type、Field古徒、PARAMETER 等類型拓提,可以參考上述給出的參考資料。通過(guò)反射 api 我們也能夠獲取一個(gè) Class 對(duì)象獲取類型隧膘、屬性代态、函數(shù)等相關(guān)的對(duì)象,通過(guò)這些對(duì)象的 getAnnotation 接口獲取到對(duì)應(yīng)的注解信息疹吃。 首先我們需要在目標(biāo)對(duì)象上添加上注解蹦疑,例如 :

@Test(tag = "Student class Test Annoatation")
public class Student extends Person implements Examination {
    // 年級(jí) 
    @Test(tag = "mGrade Test Annotation ") 
     int mGrade; 
    // ......
}

然后通過(guò)相關(guān)的注解函數(shù)得到注解信息,如下所示 :

private static void getAnnotationInfos() { 
    Student student = new Student("mr.simple"); 
    Test classTest = student.getClass().getAnnotation(Test.class); 
    System.out.println("class Annotatation tag = " + classTest.tag()); 

    Field field = null; 
    try { 
        field = student.getClass().getDeclaredField("mGrade"); 
        Test testAnnotation = field.getAnnotation(Test.class); 
        System.out.println("屬性的 Test 注解 tag : " + testAnnotation.tag()); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 
}

輸出結(jié)果為 : >

class Annotatation tag = Student class Test Annoatation
屬性的 Test 注解 tag : mGrade Test Annotation

接口說(shuō)明

// 獲取指定類型的注解
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) ;

// 獲取 Class 對(duì)象中的所有注解
public Annotation[] getAnnotations() ;

雜談
反射作為 Java 語(yǔ)言的重要特性萨驶,在開(kāi)發(fā)中有著極為重要的作用歉摧。很多開(kāi)發(fā)框架都是基于反射來(lái)實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的操作,而反射配合注解更是設(shè)計(jì)開(kāi)發(fā)框架的主流選擇腔呜,例如 ActiveAndroid叁温,因此深入了解反射的作用以及使用對(duì)于日后開(kāi)發(fā)和學(xué)習(xí)必定大有益處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末核畴,一起剝皮案震驚了整個(gè)濱河市券盅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膛檀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘侍,死亡現(xiàn)場(chǎng)離奇詭異咖刃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)憾筏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門嚎杨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人氧腰,你說(shuō)我怎么就攤上這事枫浙∨偎啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵箩帚,是天一觀的道長(zhǎng)真友。 經(jīng)常有香客問(wèn)我,道長(zhǎng)紧帕,這世上最難降的妖魔是什么盔然? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮是嗜,結(jié)果婚禮上愈案,老公的妹妹穿的比我還像新娘。我一直安慰自己鹅搪,他們只是感情好站绪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著丽柿,像睡著了一般恢准。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上航厚,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天顷歌,我揣著相機(jī)與錄音,去河邊找鬼幔睬。 笑死眯漩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的麻顶。 我是一名探鬼主播赦抖,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辅肾!你這毒婦竟也來(lái)了队萤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矫钓,失蹤者是張志新(化名)和其女友劉穎要尔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體新娜,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赵辕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了概龄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片还惠。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖私杜,靈堂內(nèi)的尸體忽然破棺而出蚕键,到底是詐尸還是另有隱情救欧,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布锣光,位于F島的核電站笆怠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫉晶。R本人自食惡果不足惜骑疆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望替废。 院中可真熱鬧箍铭,春花似錦、人聲如沸椎镣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)状答。三九已至冷守,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惊科,已是汗流浹背拍摇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馆截,地道東北人充活。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜡娶,于是被迫代替她去往敵國(guó)和親混卵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以讓我們?cè)谶\(yùn)行時(shí)獲取類的函數(shù)窖张、...
    Ten_Minutes閱讀 530評(píng)論 0 4
  • 前言 人生苦多幕随,快來(lái) Kotlin ,快速學(xué)習(xí)Kotlin宿接! 什么是Kotlin赘淮? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,145評(píng)論 9 118
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)睦霎,斷路器拥知,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 親我想跟你說(shuō)清 你對(duì)我并不很好 我們需要有距離 就算你對(duì)我很好 我不喜歡你性情 所以請(qǐng)保持距離 就算你對(duì)我很好 我...
    獅女柔心_Nicole陶閱讀 224評(píng)論 0 1
  • 占斷內(nèi)容: 斷: 四值火金俱旺。 我在想卦主腦袋中困擾的碎赢,是租房合同對(duì)自己的制約,官鬼就是制約之神速梗,持世肮塞,也就代表...
    子午九閱讀 280評(píng)論 0 0