国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java 反射設(shè)置/獲取對(duì)象屬性值

這篇具有很好參考價(jià)值的文章主要介紹了Java 反射設(shè)置/獲取對(duì)象屬性值。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?大家好,我是【zhuzicc】~ ,一位主攻【Java】的 攻城獅!?

歡迎對(duì)【Java】感興趣的大佬,關(guān)注我 ??
————————————————
?? ?? ??
如果覺得本文還不錯(cuò),點(diǎn)贊 + 評(píng)論 + 關(guān)注 + 收藏。有補(bǔ)充歡迎評(píng)論交流,我將努力創(chuàng)作更多更好的文章。
大佬們的支持,是我創(chuàng)作的動(dòng)力!
?? ?? ??


本文總結(jié):Java 通過(guò)反射設(shè)置對(duì)象屬性值,或者獲取對(duì)象屬性值,編碼過(guò)程中反射結(jié)合泛型使用可以代碼復(fù)用,減少冗余代碼;
食用建議:配合場(chǎng)景案例食用更佳;

設(shè)置/獲取屬性

實(shí)體類對(duì)象:

@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentScore {
    /**
     * 名稱
     */
    private String name;
    /**
     * 科目
     */
    private String subject;
    /**
     * 成績(jī)
     */
    private Integer score;
}

方式一

通過(guò)Field操作屬性:

public void method1() throws Exception {
        Class<StudentScore> cls = StudentScore.class;
        StudentScore obj = new StudentScore();
        StudentScore obj2 = new StudentScore();
        /*
         * 設(shè)置屬性
         */
        Field nameField = cls.getDeclaredField("name");
        nameField.setAccessible(true);
        nameField.set(obj, "張三");

        Field subjectField = cls.getDeclaredField("subject");
        subjectField.setAccessible(true);
        subjectField.set(obj, "語(yǔ)文");

        Field scoreField = cls.getDeclaredField("score");
        scoreField.setAccessible(true);
        scoreField.set(obj, 100);

        /*
         * 獲取屬性
         */
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            String s = Modifier.toString(field.getModifiers());
            // 排除final修飾的屬性
            if (!s.contains("final")) {
                field.setAccessible(true);
                // 通過(guò)filed獲取設(shè)置屬性
                System.out.printf("獲取屬性值,當(dāng)前屬性:%s,值:%s%n", field.getName(), field.get(obj));
                // obj對(duì)象屬性值賦值給obj2
                field.set(obj2, field.get(obj));
            }
        }
        System.out.println("method1 obj:" + JSONObject.toJSONString(obj));
        System.out.println("method1 obj2:" + JSONObject.toJSONString(obj2));
    }

運(yùn)行結(jié)果:
java 反射獲取屬性值,Java,java,jvm,servlet

方式二

通過(guò)set方法:

public void method2() throws Exception {
        Class<StudentScore> cls = StudentScore.class;
        StudentScore obj = new StudentScore();

        /*
         * 設(shè)置屬性
         */
        Method setName = cls.getMethod("setName", String.class);
        setName.invoke(obj, "李四");

        Method setSubject = cls.getMethod("setSubject", String.class);
        setSubject.invoke(obj, "語(yǔ)文");

        Method setScore = cls.getMethod("setScore", Integer.class);
        setScore.invoke(obj, 114);

        /*
         * 獲取屬性
         */
        Method getName = cls.getMethod("getName");
        System.out.printf("獲取屬性值,當(dāng)前屬性:%s,值:%s%n", "name", getName.invoke(obj));
        Method getSubject = cls.getMethod("getSubject");
        System.out.printf("獲取屬性值,當(dāng)前屬性:%s,值:%s%n", "subject", getSubject.invoke(obj));
        Method getScore = cls.getMethod("getScore");
        System.out.printf("獲取屬性值,當(dāng)前屬性:%s,值:%s%n", "score", getScore.invoke(obj));
        System.out.println("method2:" + JSONObject.toJSONString(obj));
    }

運(yùn)行結(jié)果:

java 反射獲取屬性值,Java,java,jvm,servlet

方式三

通過(guò)屬性名:

public void method3() throws Exception {
        Class<StudentScore> cls = StudentScore.class;
        StudentScore obj = new StudentScore();
        /*
         * 設(shè)置屬性
         */
        PropertyDescriptor namePd = new PropertyDescriptor("name", cls);
        Method writeMethod = namePd.getWriteMethod();
        writeMethod.invoke(obj, "王五");

        PropertyDescriptor subjectPd = new PropertyDescriptor("subject", cls);
        Method subjectMethod = subjectPd.getWriteMethod();
        subjectMethod.invoke(obj, "語(yǔ)文");

        PropertyDescriptor scorePd = new PropertyDescriptor("score", cls);
        Method scoreMethod = scorePd.getWriteMethod();
        scoreMethod.invoke(obj, 127);

        /*
         * 獲取屬性
         */
        Method nameRead = namePd.getReadMethod();
        System.out.printf("獲取屬性值,當(dāng)前屬性:%s,值:%s%n", "name", nameRead.invoke(obj));
        Method subjectRead = subjectPd.getReadMethod();
        System.out.printf("獲取屬性值,當(dāng)前屬性:%s,值:%s%n", "subject", subjectRead.invoke(obj));
        Method scoreRead = scorePd.getReadMethod();
        System.out.printf("獲取屬性值,當(dāng)前屬性:%s,值:%s%n", "score", scoreRead.invoke(obj));
        System.out.println("method3:" + JSONObject.toJSONString(obj));
    }

運(yùn)行結(jié)果:

java 反射獲取屬性值,Java,java,jvm,servlet

場(chǎng)景案例

場(chǎng)景:學(xué)生查詢自己的語(yǔ)文考試成績(jī);

java 反射獲取屬性值,Java,java,jvm,servlet

學(xué)生成績(jī)對(duì)象實(shí)體類:

/**
 * 學(xué)生成績(jī)實(shí)體
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentScore {

    /**
     * 名稱
     */
    private String name;
    /**
     * 科目
     */
    private String subject;
    /**
     * 成績(jī)
     */
    private Integer score;

}

學(xué)生對(duì)象實(shí)體類:

/**
 * 學(xué)生-張三
 */
@Data
public class StudentZS extends StudentScore {
}
/**
 * 學(xué)生-李四
 *
 */
@Data
public class StudentLS extends StudentScore {
}
/**
 * 學(xué)生-王五
 */
@Data
public class StudentWW extends StudentScore {
}

測(cè)試:

@Test
public void testDemo() {
    StudentZS student1 = new StudentZS();
    student1.setName("張三");
    scoreSystem(student1, StudentZS.class);
    System.out.println("張三查詢成績(jī)結(jié)果:" + JSONObject.toJSONString(student1));

    StudentLS student2 = new StudentLS();
    student2.setName("李四");
    scoreSystem(student2, StudentLS.class);
    System.out.println("李四查詢成績(jī)結(jié)果:" + JSONObject.toJSONString(student2));

    StudentWW student3 = new StudentWW();
    student3.setName("王五");
    scoreSystem(student3, StudentWW.class);
    System.out.println("王五查詢成績(jī)結(jié)果:" + JSONObject.toJSONString(student3));
}

/**
  * 成績(jī)系統(tǒng)
  *
  * @param t   學(xué)生
  * @param cls 學(xué)生類
  * @param <T> 泛型
  */
public <T> void scoreSystem(T t, Class<T> cls) {
    // 給傳入對(duì)象賦值名稱
    try {
        Class<? super T> superclass = cls.getSuperclass();
        Field nameField = superclass.getDeclaredField("name");
        Type genericType = nameField.getGenericType();
        String typeName = genericType.getTypeName();
        assert "java.lang.String".equals(typeName);
        nameField.setAccessible(true);
        String studentName = nameField.get(t).toString();
        int schoolReport = 0;
        switch (studentName) {
            case "張三":
                schoolReport = 100;
                break;
            case "李四":
                schoolReport = 114;
                break;
            case "王五":
                schoolReport = 127;
                break;
        }
        Field subjectField = superclass.getDeclaredField("subject");
        subjectField.setAccessible(true);
        subjectField.set(t, "語(yǔ)文");
        Field scoreField = superclass.getDeclaredField("score");
        scoreField.setAccessible(true);
        scoreField.set(t, schoolReport);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

運(yùn)行結(jié)果:
java 反射獲取屬性值,Java,java,jvm,servlet文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-732210.html

到了這里,關(guān)于Java 反射設(shè)置/獲取對(duì)象屬性值的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java 基礎(chǔ)進(jìn)階篇(十七):反射概述及獲取對(duì)象的方式

    Java 基礎(chǔ)進(jìn)階篇(十七):反射概述及獲取對(duì)象的方式

    反射是指對(duì)于任何一個(gè)Class類,在 “運(yùn)行的時(shí)候”,不用創(chuàng)建對(duì)象,就可以直接得到這個(gè)類全部成分。 在運(yùn)行時(shí),可以直接得到這個(gè)類的構(gòu)造器對(duì)象:Constructor 在運(yùn)行時(shí),可以直接得到這個(gè)類的成員變量對(duì)象:Field 在運(yùn)行時(shí),可以直接得到這個(gè)類的成員方法對(duì)象:Method 這種

    2024年02月07日
    瀏覽(24)
  • Java通過(guò)屬性名獲取Object對(duì)象屬性值

    通過(guò)已知的屬性名稱,從對(duì)象里獲取數(shù)據(jù)的方式 通過(guò)將Object轉(zhuǎn)為Map: 通過(guò)invoke方式: 調(diào)用方式:

    2024年02月15日
    瀏覽(24)
  • Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化

    Java進(jìn)階(4)——結(jié)合類加載JVM的過(guò)程理解創(chuàng)建對(duì)象的幾種方式:new,反射Class,克隆clone(拷貝),序列化反序列化

    1.類什么時(shí)候被加載到JVM中,new,Class.forName: Class.forName(“包名.類名”); 2.創(chuàng)建對(duì)象的方式,反射,本質(zhì)是獲得類的類對(duì)象Class; 3.克隆clone,深拷貝,淺拷貝的對(duì)比; 4.序列化和反序列化的方式; Hello h; // 此時(shí)沒有用Hello,jvm并沒有進(jìn)行類加載 看到new : new Book() Class.forName:

    2024年02月12日
    瀏覽(30)
  • 【Java 8 新特性】獲取對(duì)象列表中的某個(gè)屬性組成的列表

    【Java 8 新特性】獲取對(duì)象列表中的某個(gè)屬性組成的列表

    1、用法示例 獲取list中所有對(duì)象的某個(gè)屬性 2、詳細(xì)案例 UserEntity.java Test.java 輸出結(jié)果: 1、Java 8 Stream 基本介紹 Java 8 API添加了一個(gè)新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數(shù)據(jù)。 Stream 使用一種類似用 SQL 語(yǔ)句從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)的直觀方式來(lái)提供一種對(duì) Java 集合

    2024年02月10日
    瀏覽(31)
  • 【Java】反射簡(jiǎn)介,利用反射打印一個(gè)類當(dāng)中的構(gòu)造函數(shù),方法和屬性。

    【Java】反射簡(jiǎn)介,利用反射打印一個(gè)類當(dāng)中的構(gòu)造函數(shù),方法和屬性。

    ? ???個(gè)人主頁(yè):哈__ 期待您的關(guān)注? 我想要通過(guò)反射來(lái)打印如下效果的類信息。 Student類如下代碼所示。 ?你是否有思路?如果你不了解反射的話,我來(lái)給大家簡(jiǎn)單的介紹一下反射的使用方法。 1、Java反射機(jī)制的核心是在程序運(yùn)行時(shí)動(dòng)態(tài)加載類并獲取類的詳細(xì)信息,從而操

    2024年04月10日
    瀏覽(18)
  • java通過(guò)反射創(chuàng)建反射對(duì)象三種的方法

    目錄 前言: 代碼部分: computer類: 1.類名.class創(chuàng)建反射對(duì)象: 2.對(duì)象.getclass創(chuàng)建反射對(duì)象: 3.Class.forName(\\\"\\\")創(chuàng)建反射對(duì)象: JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)

    2024年02月14日
    瀏覽(30)
  • 【Java 基礎(chǔ)篇】Java反射:深入了解Class對(duì)象

    【Java 基礎(chǔ)篇】Java反射:深入了解Class對(duì)象

    Java是一門強(qiáng)類型語(yǔ)言,它要求在編譯時(shí)知道所有的類和對(duì)象類型。然而,有時(shí)候我們需要在運(yùn)行時(shí)動(dòng)態(tài)地獲取和操作類的信息,這就是Java反射的用武之地。本文將深入探討Java反射,特別是與Class對(duì)象相關(guān)的內(nèi)容。 反射是一種機(jī)制,允許我們?cè)谶\(yùn)行時(shí)檢查、獲取和操作類的信

    2024年02月06日
    瀏覽(24)
  • 使用Java反射針對(duì)對(duì)象字段比較。

    在Java開發(fā)中,我們經(jīng)常需要比較兩個(gè)對(duì)象的字段差異,尤其是在處理數(shù)據(jù)同步、狀態(tài)更新等場(chǎng)景中。本文介紹了如何使用Java反射和Stream API優(yōu)化對(duì)象字段比較的過(guò)程。 類型檢查 : 確保傳入的兩個(gè)對(duì)象屬于同一類型,否則拋出異常。 使用Stream API : 利用Stream API和Lambda表達(dá)式簡(jiǎn)化

    2024年04月14日
    瀏覽(24)
  • Java中的反射(通過(guò)反射獲取類的結(jié)構(gòu)、invoke方法、獲取注解)

    Java中的反射(通過(guò)反射獲取類的結(jié)構(gòu)、invoke方法、獲取注解)

    創(chuàng)建運(yùn)行時(shí)類的對(duì)象是反射機(jī)制應(yīng)用最多的地方。創(chuàng)建運(yùn)行時(shí)類的對(duì)象有兩種方式: 方式1:直接調(diào)用Class對(duì)象的newInstance()方法 要求: 1)類必須有一個(gè)無(wú)參數(shù)的構(gòu)造器。 2)類的構(gòu)造器的訪問權(quán)限需要足夠。 方式一的步驟 : 1)獲取該類型的Class對(duì)象 2)調(diào)用Class對(duì)象的 new

    2024年02月04日
    瀏覽(28)
  • 【Java】常見面試題:HTTP/HTTPS、Servlet、Cookie、Linux和JVM

    【Java】常見面試題:HTTP/HTTPS、Servlet、Cookie、Linux和JVM

    努力經(jīng)營(yíng)當(dāng)下 直至未來(lái)明朗! “抓包工具”:是個(gè)特殊的軟件,相當(dāng)于一個(gè)“代理程序”,瀏覽器給服務(wù)器的請(qǐng)求就會(huì)經(jīng)過(guò)這個(gè)代理程序(響應(yīng)也是經(jīng)過(guò)該代理程序的),進(jìn)一步的就能分析出請(qǐng)求和響應(yīng)的結(jié)果如何。 fiddler可以抓取http請(qǐng)求,也可以開啟抓取https請(qǐng)求。 HTTP

    2024年02月12日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包