code

반사를 통해 개체의 필드를 가져 오는 방법은 무엇입니까?

codestyles 2020. 11. 17. 08:07
반응형

반사를 통해 개체의 필드를 가져 오는 방법은 무엇입니까?


Java에 객체 (기본적으로 VO)가 있는데 그 유형을 모릅니다.
해당 개체에서 null이 아닌 값을 가져와야합니다.

어떻게 할 수 있습니까?


Class#getDeclaredFields()클래스의 모든 선언 된 필드를 가져 오는 데 사용할 수 있습니다 . Field#get()값을 얻는 데 사용할 수 있습니다 .

요컨대 :

Object someObject = getItSomehow();
for (Field field : someObject.getClass().getDeclaredFields()) {
    field.setAccessible(true); // You might want to set modifier to public first.
    Object value = field.get(someObject); 
    if (value != null) {
        System.out.println(field.getName() + "=" + value);
    }
}

반사에 대해 자세히 알아 보려면 주제에 대한 Sun 자습서를 확인하십시오 .


즉, 필드가 반드시 모두 VO의 속성을 나타내는 것은 아닙니다 . get또는로 시작하는 공용 메서드를 결정한 is다음이를 호출하여 실제 속성 값 을 가져오고 싶습니다 .

for (Method method : someObject.getClass().getDeclaredMethods()) {
    if (Modifier.isPublic(method.getModifiers())
        && method.getParameterTypes().length == 0
        && method.getReturnType() != void.class
        && (method.getName().startsWith("get") || method.getName().startsWith("is"))
    ) {
        Object value = method.invoke(someObject);
        if (value != null) {
            System.out.println(method.getName() + "=" + value);
        }
    }
}

즉, 실제 문제를 해결하는 더 우아한 방법이있을 수 있습니다. 이것이 올바른 솔루션이라고 생각하는 기능적 요구 사항에 대해 조금 더 자세히 설명하면 올바른 솔루션을 제안 할 수 있습니다. 많은이 있습니다 많은 마사지 자바 빈즈에 사용할 수있는 도구가.


일반적인 방식으로 원하는 것을 수행하는 빠르고 더러운 방법이 있습니다. 예외 처리를 추가해야하며 약한 해시 맵에 BeanInfo 유형을 캐시하고 싶을 것입니다.

public Map<String, Object> getNonNullProperties(final Object thingy) {
    final Map<String, Object> nonNullProperties = new TreeMap<String, Object>();
    try {
        final BeanInfo beanInfo = Introspector.getBeanInfo(thingy
                .getClass());
        for (final PropertyDescriptor descriptor : beanInfo
                .getPropertyDescriptors()) {
            try {
                final Object propertyValue = descriptor.getReadMethod()
                        .invoke(thingy);
                if (propertyValue != null) {
                    nonNullProperties.put(descriptor.getName(),
                            propertyValue);
                }
            } catch (final IllegalArgumentException e) {
                // handle this please
            } catch (final IllegalAccessException e) {
                // and this also
            } catch (final InvocationTargetException e) {
                // and this, too
            }
        }
    } catch (final IntrospectionException e) {
        // do something sensible here
    }
    return nonNullProperties;
}

다음 참조를 참조하십시오.


Java에 객체 (기본적으로 VO)가 있는데 그 유형을 모릅니다. 해당 개체에서 null이 아닌 값을 가져와야합니다.

Maybe you don't necessary need reflection for that -- here is a plain OO design that might solve your problem:

  1. Add an interface Validation which expose a method validate which checks the fields and return whatever is appropriate.
  2. Implement the interface and the method for all VO.
  3. When you get a VO, even if it's concrete type is unknown, you can typecast it to Validation and check that easily.

I guess that you need the field that are null to display an error message in a generic way, so that should be enough. Let me know if this doesn't work for you for some reason.

참고URL : https://stackoverflow.com/questions/2989560/how-to-get-the-fields-in-an-object-via-reflection

반응형