Я не знаю, если это то, что вы действительно хотите. Возможно, вы могли бы дать дополнительную информацию о том, чего вы хотите достичь. Но если вы хотите получить доступ к Lookup.IMPL_LOOKUP
, вы можете сделать это, как в этом примере кода:
public class Main {
public static void main(String[] args) {
Lookup myLookup = MethodHandles.lookup(); // the Lookup which should be trusted
NestedTestClass ntc = new Main().new NestedTestClass(); // test class instance
try {
Field impl_lookup = Lookup.class.getDeclaredField("IMPL_LOOKUP"); // get the required field via reflections
impl_lookup.setAccessible(true); // set it accessible
Lookup lutrusted = (Lookup) impl_lookup.get(myLookup); // get the value of IMPL_LOOKUP from the Lookup instance and save it in a new Lookup object
// test the trusted Lookup
MethodHandle pmh = lutrusted.findVirtual(NestedTestClass.class, "gimmeTheAnswer", MethodType.methodType(int.class));
System.out.println(pmh.invoke(ntc));
} catch (Throwable e) {
e.printStackTrace();
}
}
// nested class with private method for testing
class NestedTestClass{
@SuppressWarnings("unused")
private int gimmeTheAnswer(){
return 42;
}
}
}
Он работает с JDK 7, но может сломаться в JDK 8. И будьте осторожны! Мой антивирус выдал сигнал тревоги, когда я его выполнил. Я думаю, что нет публичного или чистого способа сделать это.
У меня была аналогичная проблема и, наконец, нашли решение: Access non-public (java-native) classes from JDK (7).
Я столкнулся аналогичные проблемы (для геттеров/сеттеры), это будет здорово, если вы можете поделиться, как вам удалось вызвать частные методы? – bachr
См. Примеры в ответах ниже? –
Он использует отражение, чтобы установить доступность перед вызовом invoke, мне было интересно, почему это нужно делать, поскольку lookup() должен предоставлять доступ вызывающим абонентам к прямым/закрытым полям и методам, указанным в [documentation] (http: // docs .oracle.com/JavaSE/7/документы/API/Java/языки/ссылаться/MethodHandles.html # поиск% 28% 29). – bachr