Baru-baru ini saya menghadapi masalah dalam projek, iaitu untuk melaksanakan kaedah universal untuk menukar bahasa berbilang bahasa masa hadapan Berdasarkan keperluan ini, saya memutuskan untuk menggunakan refleksi untuk melaksanakannya dan menetapkan objek sifat berdasarkan nilai pantulan, berikut ialah kaedah untuk menggunakan pantulan untuk menetapkan nilai atribut objek
//Tetapkan nilai kepada pembolehubah dan tetapkan nilai pada medan objek objek
f.set(objek, nilai);
//Selepas anda mendapat contoh kelas Field, anda boleh Panggil kaedah
//Kaedah: get(Object obj) Mengembalikan nilai medan yang diwakili oleh Medan ini pada yang ditentukan object 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()); } }
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()); } }
Ia boleh dilihat bahawa menggunakan refleksi kita boleh menetapkan setiap atribut dengan mudah , kita boleh menetapkan nilai atribut dengan mudah Mari kita gunakan contoh demo ini di bawah.
Dengan kata lain, kaedah pertama melengkapkan tugasan tanpa memanggil kaedah set atribut,
Tetapi kaedah kedua ialah dengan memanggil kaedah set atribut untuk menyiapkan tugasan.
Jadi, jika anda ingin menukar nilai atribut program dalam program dan juga ingin melakukan beberapa perkara tambahan, anda boleh menulis perkara ini ke dalam kaedah yang ditetapkan dan menggunakan kaedah kedua
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; } }
Idea teras kelas alat ini ialah
Gunakan kaedah get Field untuk mendapatkan nilai atribut
Kaedah set medan untuk menetapkan atribut
//Tetapkan nilai kepada pembolehubah dan tetapkan nilai pada medan objek objek
f.set(objek, nilai);
//Dapatkan contoh kelas Medan Kemudian anda boleh memanggil kaedah
//Kaedah: get(Object obj) mengembalikan nilai medan yang diwakili oleh Medan ini pada obj objek yang ditentukan
Atas ialah kandungan terperinci Bagaimana untuk memberikan nilai kepada sifat objek menggunakan refleksi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!