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