최근에 미래의 다국어 언어 변환을 위한 보편적인 방법을 구현하는 프로젝트에서 문제가 발생했습니다. 이 요구 사항에 따라 리플렉션을 사용하여 이를 구현하고 개체 속성에 대한 속성 값을 설정하기로 결정했습니다. Reflection을 기반으로 다음은 Reflection을 사용하여 객체 속성 값을 설정하는 방법입니다
//객체 객체에 변수 할당 필드에 값 할당
f.set(object, value);
//Field 클래스의 인스턴스를 가져온 후 해당 메서드를 호출할 수 있습니다.
//메서드: get(Object obj)은 지정된 객체 obj를 반환합니다. Field
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()); } }
Reflection을 사용하면 다음을 수행할 수 있음을 알 수 있습니다. 각 속성을 쉽게 설정할 수 있습니다. 개인 속성의 경우에도 속성 값을 쉽게 설정할 수 있습니다. 이 데모 예제를 사용하여 초기 기능을 설정해 보겠습니다.
즉, 첫 번째 메소드는 속성의 set 메소드를 호출하지 않고 할당을 완료하지만,
두 번째 메소드는 속성의 set 메소드를 호출하여 할당을 완료합니다.
그래서 프로그램에서 프로그램 속성의 값을 변경하고 싶고 추가 작업도 하고 싶다면 set 메소드에 이런 것들을 작성하고 두 번째 메소드를 사용하면 됩니다
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; } }
핵심 아이디어는 이 도구 클래스는
Field의 get 메소드를 사용하여 속성 값을 가져옵니다
Field의 set 메소드를 사용하여 속성을 설정합니다
// 변수에 값 할당 개체 개체의 필드에 값 할당
f.set(object, value);
//Field 클래스의 인스턴스를 가져온 후 해당 클래스의 메서드를 호출할 수 있습니다.
//메서드: get(Object obj)는 다음이 나타내는 필드의 값을 반환합니다. 지정된 객체 obj
의 이 필드위 내용은 Java 리플렉션을 사용하여 객체 속성에 값을 할당하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!