2016-06-11 3 views
0

동적으로 기본 메소드를 호출 할 수있는 방법은 다음과 같은 것을 알아 냈 :자바 반사 통화 기본 방법은 이전 글에서

final Class<?> declaringClass = method.getDeclaringClass(); 

final Constructor<Lookup> constructor = 
MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class); 

constructor.setAccessible(true); 

final MethodHandles.Lookup defaultMethodLookup = 
       constructor.newInstance(declaringClass, MethodHandles.Lookup.PRIVATE); 

return defaultMethodLookup 
      .unreflectSpecial(method, declaringClass) 
      .bindTo(proxy) 
      .invokeWithArguments(args); 

이 완벽하게 잘 작동; 그러나 호출이 특정 메서드를 재정의하는 파생 인터페이스에서 발생한 경우 위의 코드는 기본 인터페이스의 메서드를 호출합니다.

기본 인터페이스에 기본 메소드가 있고 'void fire()'라고 말하면 하위 인터페이스가이 메소드를 대체하고 기본 메소드를 호출하는 메커니즘이 호출되고 항상 기본 클래스에있는 하나뿐입니다.

+0

첫 번째 줄의 * 방법 *은 어디에서 왔습니까? – waltersu

+0

@waltersu 호출 핸들러의'invoke' 메소드에 대한 인수. 위의 코드는 호출 핸들러 안에 있습니다. –

답변

0

그냥 업데이트를 위해 다르게 해결할 수있었습니다. 그래서 기본적으로 프록시를 통해 현재 객체를 추적하므로 리플렉션을 통해 올바른 (파생 된) 메서드를 얻었고이를 MethodLookup을 수행하면 정상적으로 작동합니다. 감사합니다.