Java反射 Reflection

1.1 什么是 Java 的反射

    Java 反射是可以讓我們?cè)谶\(yùn)行時(shí)獲取類的函數(shù)纺阔、屬性、父類扇谣、接口等 Class 內(nèi)部信息的機(jī)制。通過反射還可以讓我們?cè)谶\(yùn)行期實(shí)例化對(duì)象,調(diào)用方法寒砖,通過調(diào)用 get/set 方法獲取變量的值谅猾,即使方法或?qū)傩允撬接械牡囊部梢酝ㄟ^反射的形式調(diào)用柄慰,這種“看透 class”的能力被稱為內(nèi)省,這種能力在框架開發(fā)中尤為重要税娜。 有些情況下先煎,我們要使用的類在運(yùn)行時(shí)才會(huì)確定,這個(gè)時(shí)候我們不能在編譯期就使用它巧涧,因此只能通過反射的形式來使用在運(yùn)行時(shí)才存在的類(該類符合某種特定的規(guī)范薯蝎,例如 JDBC),這是反射用得比較多的場(chǎng)景谤绳。
    還有一個(gè)比較常見的場(chǎng)景就是編譯時(shí)我們對(duì)于類的內(nèi)部信息不可知占锯,必須得到運(yùn)行時(shí)才能獲取類的具體信息袒哥。比如 ORM 框架,在運(yùn)行時(shí)才能夠獲取類中的各個(gè)屬性消略,然后通過反射的形式獲取其屬性名和值堡称,存入數(shù)據(jù)庫。這也是反射比較經(jīng)典應(yīng)用場(chǎng)景之一艺演。

1.2 Class 類

arch.png

當(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ì)象介汹。我們通過 new 的形式創(chuàng)建對(duì)象實(shí)際上就是通過這些 Class 來創(chuàng)建,只是這個(gè)過程對(duì)于我們是不透明的而已舶沛。

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ì)象豪娜,那么你可以通過下面的方法得到:

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

如果你在編譯期獲取不到目標(biāo)類型,但是你知道它的完整類路徑哟楷,那么你可以通過如下的形式來獲取 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í)惩阶,沒有在編譯路徑下(classpath)找到對(duì)應(yīng)的類挎狸,那么將會(huì)拋出 ClassNotFoundException。

接口說明

// 加載指定的 Class 對(duì)象断楷,參數(shù) 1 為要加載的類的完整路徑锨匆,例如"com.simple.Student". ( 常用方式 )
public static Class<?> forName (String className)

// 加載指定的 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 通過 Class 對(duì)象構(gòu)造目標(biāo)類型的對(duì)象
一旦你拿到 Class 對(duì)象之后茅主,你就可以為所欲為了!當(dāng)你善用它的時(shí)候它就是神兵利器土榴,當(dāng)你心懷鬼胎之時(shí)它就會(huì)變成惡魔诀姚。但獲取 Class 對(duì)象只是第一步,我們需要在執(zhí)行那些強(qiáng)大的行為之前通過 Class 對(duì)象構(gòu)造出該類型的對(duì)象玷禽,然后才能通過該對(duì)象釋放它的能量赫段。 我們知道,在 java 中要構(gòu)造對(duì)象矢赁,必須通過該類的構(gòu)造函數(shù)糯笙,那么其實(shí)反射也是一樣一樣的。但是它們確實(shí)有區(qū)別的坯台,通過反射構(gòu)造對(duì)象炬丸,我們首先要獲取類的 Constructor(構(gòu)造器)對(duì)象瘫寝,然后通過 Constructor 來創(chuàng)建目標(biāo)類的對(duì)象蜒蕾。還是直接上代碼的。

private static void classForName() {
try {
// 獲取 Class 對(duì)象
Class<?> clz = Class.forName("org.java.advance.reflect.Student");
// 通過 Class 對(duì)象獲取 Constructor焕阿,Student 的構(gòu)造函數(shù)有一個(gè)字符串參數(shù)
// 因此這里需要傳遞參數(shù)的類型 ( Student 類見后面的代碼 )
Constructor<?> constructor = clz.getConstructor(String.class);
// 通過 Constructor 來創(chuàng)建 Student 對(duì)象
Object obj = constructor.newInstance("mr.simple");
System.out.println(" obj : " + obj.toString());
} catch (Exception e) {
e.printStackTrace();
}
}````
通過上述代碼咪啡,我們就可以在運(yùn)行時(shí)通過完整的類名來構(gòu)建對(duì)象。

獲取構(gòu)造函數(shù)接口

// 獲取一個(gè)公有的構(gòu)造函數(shù)暮屡,參數(shù)為可變參數(shù)撤摸,如果構(gòu)造函數(shù)有參數(shù),那么需要將參數(shù)的類型傳遞給 getConstructor 方法
public Constructor<T> getConstructor (Class...<?> parameterTypes)
// 獲取目標(biāo)類所有的公有構(gòu)造函數(shù)
public Constructor[]<?> getConstructors ()````

注意褒纲,當(dāng)你通過反射獲取到 Constructor准夷、Method、Field 后莺掠,在反射調(diào)用之前將此對(duì)象的 accessible 標(biāo)志設(shè)置為 true衫嵌,以此來提升反射速度。值為 true 則指示反射的對(duì)象在使用時(shí)應(yīng)該取消 Java 語言訪問檢查彻秆。值為 false 則指示反射的對(duì)象應(yīng)該實(shí)施 Java 語言訪問檢查楔绞。例如 :

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);````

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)前類中定義的所有方法可以通過 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 方法可以通過 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 {
        // 通過 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();
    }
}````
接口說明
// 獲取 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ù) ( 包含從父類和接口類集成下來的函數(shù) )
public Method[] getMethods ()````
這里需要注意的是 getDeclaredMethod 和 getDeclaredMethods 包含 private匪凡、protected、default掘猿、public 的函數(shù)病游,并且通過這兩個(gè)函數(shù)獲取到的只是在**自身中定義**的函數(shù),**從父類中集成的函數(shù)不能夠獲取到**稠通。而 getMethod 和 getMethods **只包含 public 函數(shù)**衬衬,**父類中的公有函數(shù)也能夠獲取到**。

####4 反射獲取類中的屬性
#####4.1 獲取當(dāng)前類中定義的屬性
要獲取當(dāng)前類中定義的所有屬性可以通過 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 屬性可以通過 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();
        }
    }````
######接口說明

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

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

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

// 獲取該 Class 對(duì)象中的所有公有屬性 ( 包含從父類和接口類集成下來的公有屬性 )
public Method[] getFields ()````
這里需要注意的是 getDeclaredField 和 getDeclaredFields 包含 private、protected胖烛、default眼姐、public 的屬性,并且通過這兩個(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 獲取注解信息

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

@Target({
            ElementType.METHOD, ElementType.FIELD, ElementType.TYPE
    })
    @Retention(RetentionPolicy.RUNTIME)
    static @interface Test {

    }````
上述注解的@target 表示該注解只能用在函數(shù)上,還有 Type樟遣、Field而叼、PARAMETER 等類型,可以參考上述給出的參考資料豹悬。通過反射 api 我們也能夠獲取一個(gè) Class 對(duì)象獲取類型葵陵、屬性、函數(shù)等相關(guān)的對(duì)象瞻佛,通過這些對(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ā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````

接口說明
// 獲取指定類型的注解
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) ;
// 獲取 Class 對(duì)象中的所有注解
public Annotation[] getAnnotations() ;````
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绊困,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子响迂,更是在濱河造成了極大的恐慌考抄,老刑警劉巖细疚,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔗彤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疯兼,警方通過查閱死者的電腦和手機(jī)然遏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吧彪,“玉大人待侵,你說我怎么就攤上這事∫搪悖” “怎么了秧倾?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)傀缩。 經(jīng)常有香客問我那先,道長(zhǎng),這世上最難降的妖魔是什么赡艰? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任售淡,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揖闸。我一直安慰自己揍堕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布汤纸。 她就那樣靜靜地躺著衩茸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贮泞。 梳的紋絲不亂的頭發(fā)上递瑰,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音隙畜,去河邊找鬼抖部。 笑死,一個(gè)胖子當(dāng)著我的面吹牛议惰,可吹牛的內(nèi)容都是我干的慎颗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼言询,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俯萎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起运杭,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤夫啊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辆憔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撇眯,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年虱咧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熊榛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腕巡,死狀恐怖玄坦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绘沉,我是刑警寧澤煎楣,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站车伞,受9級(jí)特大地震影響择懂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帖世,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一休蟹、第九天 我趴在偏房一處隱蔽的房頂上張望沸枯。 院中可真熱鬧,春花似錦赂弓、人聲如沸绑榴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翔怎。三九已至,卻和暖如春杨耙,著一層夾襖步出監(jiān)牢的瞬間赤套,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工珊膜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留容握,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓车柠,卻偏偏與公主長(zhǎng)得像剔氏,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竹祷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以讓我們?cè)谶\(yùn)行時(shí)獲取類的函數(shù)谈跛、...
    Ten_Minutes閱讀 537評(píng)論 0 4
  • 項(xiàng)目:拥坛,分析者:Mr.Simple垮卓,校對(duì)者:Trinea本文為 Android 開源項(xiàng)目源碼解析 公共技術(shù)點(diǎn)中的 ...
    zizi192閱讀 369評(píng)論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法境钟,內(nèi)部類的語法令花,繼承相關(guān)的語法阻桅,異常的語法,線程的語...
    子非魚_t_閱讀 31,633評(píng)論 18 399
  • 一彭则、了解 Java 中的反射 1. 什么是 Java 的反射 Java反射是在程序運(yùn)行時(shí)獲取類的函數(shù)鳍刷、屬性占遥、父類和...
    liwei_happyman閱讀 438評(píng)論 0 2
  • 在沒有成為自己想成為的人之前俯抖,一切就都隨她吧。愿她一切平安順利瓦胎,她信錦鯉芬萍,錦鯉大王,小生這有禮了搔啊。保佑她安好柬祠。 今...
    WHIFFET_27_zZ閱讀 265評(píng)論 0 1