2016-12-02 6 views
2

Groovy는 Java 클래스의 개인 메소드와 변수에 액세스 할 수 있습니다. Groovy는 어떻게 이것을 장면 뒤에서 할 수 있습니까? MethodHandle 클래스에서 사용하는 invokedynamic 바이트 코드 인스트럭션을 사용하고 있기 때문에입니까? 자바가 private 메소드를 호출하기 위해 invokespecial 명령어를 사용하고 액세스 수정자를 존중하는 public에 대해 invokevirtual을 사용한다고 생각하십니까?Groovy는 Java 클래스의 private 메소드에 어떻게 액세스 할 수 있습니까?

+1

반사를 사용합니다. – Henry

답변

2

Groovy는 Java로 작성되어 있으므로 바이트 코드에 직접 의존하지 않으므로 Reflection API을 사용하지 마십시오.

자세한 내용은 소스 코드에서 java.lang.reflect을 확인하면 장면 뒤에서 Reflection API를 사용하는 방법을 확인할 수 있습니다.

1
당신은 어쨌든 예를 들어,이 방법은 개인 정적 필드의 값을 설정합니다, 반사를 사용하여 자바에서이 작업을 수행 할 수 있습니다

...

public static void setStaticField(Class<?> clazz, String fieldName, Object value) { 
    try { 
     Field field = clazz.getDeclaredField(fieldName); 
     field.setAccessible(true); 
     field.set(null, value); 
    } catch (Exception ex) { 
     throw new IllegalArgumentException("Could not set field '" + fieldName + "' of type '" + clazz.getName() + "' to: " + value, ex); 
    } 
} 

공지 사항 field.setAccessible(true)

이를 방지 할 수 적절한 보안 관리자 정책을 설정해야합니다. How to restrict developers to use reflection to access private methods and constructors in Java?

+1

예, 자바에서는 리플렉션을 사용할 수 있지만 그루비는 어떻게합니까? groovy도 리플렉션을 사용합니까? – boring