Heim >Java >javaLernprogramm >Wie kann ich Objekteigenschaften mithilfe der Java-Reflektion Werte zuweisen?

Wie kann ich Objekteigenschaften mithilfe der Java-Reflektion Werte zuweisen?

WBOY
WBOYnach vorne
2023-05-07 10:43:191899Durchsuche

Vorwort

Ich bin kürzlich auf ein Problem im Projekt gestoßen, bei dem es darum geht, eine universelle Methode zur Konvertierung zukünftiger mehrsprachiger Sprachen zu implementieren. Basierend auf dieser Anforderung habe ich mich für die Verwendung von Reflection entschieden Bei der Reflektion legen Objektattribute Attributwerte fest. Das Folgende ist eine Methode zur Verwendung von Reflektion zum Festlegen von Objektattributwerten Sichtbarkeit wird festgelegt, dann ein Wert und schließlich gedruckt

// Weisen Sie einer Variablen einen Wert zu und weisen Sie einem Feld des Objektobjekts einen Wert zu

f.set (Objekt, Wert);

//Nachdem Sie die Instanz der Field-Klasse erhalten haben, können Sie die Methode aufrufen

//Methode: get(Object obj) gibt den Wert zurück des durch dieses Feld dargestellten Felds auf dem angegebenen Objekt obj

package com.example.reflectiondemo;
 
import java.lang.reflect.Field;
 
/**
 * @program my-project-model
 * @description:
 * @author: lee
 * @create: 2023/01/04 19:52
 */
public class ReflectMain {
 
    private String readOnly;
 
    public String getReadOnly() {
        return readOnly;
    }
 
    public void setReadOnly(String readOnly) {
        System.out.println("set");
        this.readOnly = readOnly;
    }
 
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        ReflectMain t = new ReflectMain();
        Field f = t.getClass().getDeclaredField("readOnly");
        f.setAccessible(true);
        f.set(t, "test");
        System.out.println(t.getReadOnly());
 
    }
}

Methode 2: Verwenden Sie die Aufrufmethode

package com.example.reflectiondemo;
 
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
/**
 * @program my-project-model
 * @description:
 * @author: lee
 * @create: 2023/01/04 19:52
 */
public class ReflectMain {
 
    private String readOnly;
 
    public String getReadOnly() {
        return readOnly;
    }
 
    public void setReadOnly(String readOnly) {
        System.out.println("set");
        this.readOnly = readOnly;
    }
 
    //    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
//        ReflectMain t = new ReflectMain();
//        Field f = t.getClass().getDeclaredField("readOnly");
//        f.setAccessible(true);
//        f.set(t, "test");
//        System.out.println(t.getReadOnly());
//
//    }
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ReflectMain t = new ReflectMain();
        Method setReadOnly = t.getClass().getMethod("setReadOnly", String.class);
        String s = "test2";
        setReadOnly.invoke(t, s);
        System.out.println(t.getReadOnly());
 
    }
}

Wie kann ich Objekteigenschaften mithilfe der Java-Reflektion Werte zuweisen?It Es ist ersichtlich, dass wir mithilfe von Reflection jedes Attribut problemlos festlegen können, auch wenn es sich um ein privates Attribut handelt, und wir können den Attributwert problemlos festlegen. Verwenden wir dieses Demo-Beispiel, um unsere anfängliche Funktion einzurichten.

Zusammenfassung:

Mit anderen Worten, die erste Methode schließt die Zuweisung ab, ohne die Set-Methode des Attributs aufzurufen,

Aber die zweite Methode Die Methode besteht darin, die Zuweisung durch Aufrufen der Set-Methode des Attributs abzuschließen.

Wenn Sie also den Wert der Programmattribute im Programm ändern und auch einige zusätzliche Dinge tun möchten, können Sie diese Dinge in die Set-Methode schreiben und die zweite Methode verwenden#🎜🎜 #

public class MultiLangContentUtil {
 
    /**
     * 从PO查询数据赋值到DTO
     * 注意!!这里的多语字段根据
     * 简体中文的变量名 英文名和繁体名需要根据规则进行 指定
     * 规则如下
     * 英文名=简体中文名2
     * 繁体名=简体中文名3
     *
     * @param targetPO        数据库中查询出的数据
     * @param targetDTO       将要转换的对象DTO
     * @param targetMultiName 需要展示的多语字段
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    public static void setMultiLangDTOName(Object targetPO, Object targetDTO, String targetMultiName) {
        try {
 
            String locale = MultiLangContentUtil.getLocale();
            Class<?> targetDTOClass = targetDTO.getClass();
            Class<?> targetPOClass = targetPO.getClass();
            //这里是将targetMultiName进行展示
            Field declaredFieldDTO = targetDTOClass.getDeclaredField(targetMultiName);
            declaredFieldDTO.setAccessible(true);
            switch (locale) {
                case ZH_CN:
                    //获取PO的值
                    Field declaredFieldPO = targetPOClass.getDeclaredField(targetMultiName);
                    //获取DTO对象
                    declaredFieldPO.setAccessible(true);
                    //对DTO根据PO进行设置
                    declaredFieldDTO.set(targetDTO, declaredFieldPO.get(targetPO));
                    break;
                case EN_US:
                    //获取PO的值
                    Field declaredFieldPO2 = targetPOClass.getDeclaredField(targetMultiName + 2);
                    //获取DTO对象
                    declaredFieldPO2.setAccessible(true);
                    //对DTO根据PO进行设置
                    declaredFieldDTO.set(targetDTO, declaredFieldPO2.get(targetPO));
                    break;
                case ZH_TW:
                    //获取PO的值
                    Field declaredFieldPO3 = targetPOClass.getDeclaredField(targetMultiName + 3);
                    //获取DTO对象
                    declaredFieldPO3.setAccessible(true);
                    //对DTO根据PO进行设置
                    declaredFieldDTO.set(targetDTO, declaredFieldPO3.get(targetPO));
                    break;
                default:
                    break;
            }
            //防止没有抽取多语的情况下没有参照返回,默认情况下设置中文
            if (StringUtils.isBlank((String) declaredFieldDTO.get(targetDTO))) {
                //获取PO的值
                Field declaredFieldPO = targetPOClass.getDeclaredField(targetMultiName);
                //获取DTO对象
                declaredFieldPO.setAccessible(true);
                //对DTO根据PO进行设置
                declaredFieldDTO.set(targetDTO, declaredFieldPO.get(targetPO));
            }
        } catch (NoSuchFieldException e) {
            log.error("查询当前字段--->{}不存在{},", targetMultiName, e);
        } catch (IllegalAccessException e) {
            log.error("查询字段--->{}多语时发生非法状态异常{},", targetMultiName, e);
        } catch (Exception e) {
            log.error("查询字段{}多语时发生错误{},", targetMultiName, e);
        } catch (Throwable throwable) {
            log.error("查询多语言字段{}发生未知错误{}", targetMultiName, ThrowableUtil.stackTraceToString(throwable));
        }
    }
 
    /**
     * 更新多语字段
     *
     * @param targetDTO     需要转换的字段
     * @param targetPO      数据库PO
     * @param fieldName     多语字段
     * @param MultiLangSize 多语字段的数量
     */
    public static void updateMultiLang(Object targetDTO, Object targetPO, String fieldName, Integer MultiLangSize) {
        try {
            Class<?> targetDTOClass = targetDTO.getClass();
            Class<?> targetPOClass = targetPO.getClass();
 
            Field dtoClassField = targetDTOClass.getDeclaredField(fieldName);
            dtoClassField.setAccessible(true);
            if (StringUtils.isNotBlank((String) dtoClassField.get(targetDTO))) {
                Field poClassField = targetPOClass.getDeclaredField(fieldName);
                poClassField.setAccessible(true);
                poClassField.set(targetPO, dtoClassField.get(targetDTO));
            }
            for (int i = 2; i <= MultiLangSize; i++) {
                Field dtoClassField2 = targetDTOClass.getDeclaredField(fieldName + i);
                dtoClassField2.setAccessible(true);
                if (StringUtils.isNotBlank((String) dtoClassField2.get(targetDTO))) {
                    Field poClassField2 = targetPOClass.getDeclaredField(fieldName + i);
                    poClassField2.setAccessible(true);
                    poClassField2.set(targetPO, dtoClassField2.get(targetDTO));
                }
            }
        } catch (NoSuchFieldException e) {
            log.error("更新当前字段--->{}不存在{},", fieldName, e);
        } catch (IllegalAccessException e) {
            log.error("更新字段--->{}多语时发生非法状态异常{},", fieldName, e);
        } catch (Exception e) {
            log.error("更新字段{}多语时发生错误{},", fieldName, e);
        } catch (Throwable throwable) {
            log.error("更新多语言字段{}发生未知错误{}", fieldName, ThrowableUtil.stackTraceToString(throwable));
        }
    }
 
    /**
     * 获取本地的语言,默认中文
     * en_US  英文
     * zh_CN  简体中文
     * zh_TW  繁体中文
     *
     * @return
     */
    public static final String getLocale() {
        String locale = InvocationInfoProxy.getLocale();
        return StringUtils.isEmpty(locale) ? "zh_CN" : locale;
    }
}

Die Kernidee dieser Werkzeugklasse ist

Verwenden Sie die Get-Methode von Field, um Attributwerte zu erhalten
  • #🎜 🎜##🎜 🎜#Die Set-Methode von Field legt Attribute fest

  • // Weisen Sie einer Variablen einen Wert und einem Feld des Objektobjekts einen Wert zu

    f.set(object , value);
//Nachdem Sie die Instanz der Field-Klasse erhalten haben, können Sie die darin enthaltene Methode aufrufen

//Methode : get(Object obj) gibt das angegebene Objekt obj zurück. Der Wert des Feldes, das durch dieses Feld dargestellt wird

Das obige ist der detaillierte Inhalt vonWie kann ich Objekteigenschaften mithilfe der Java-Reflektion Werte zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen