Java-документ MethodHandle говорит, что частный метод должен вызывать через findSpecial. Но в следующем примере я могу вызвать его через findVirtual.Метод privatehand метод, используемый с помощью findVirtual
Не могли бы вы объяснить, что мне здесь не хватает?
import java.lang.invoke.MethodHandles;
import java.lang.invoke.*;
import java.lang.invoke.MethodType;
public class PrivateClassMethodLookupTest{
public static void main(String[] args) throws Throwable{
new PrivateClassMethodLookupTest().m();
MethodHandle mh = MethodHandles.lookup()
.findVirtual(PrivateClassMethodLookupTest.class, "m", MethodType.methodType(void.class));
mh.invoke(new PrivateClassMethodLookupTest());
}
private void m() { System.out.println("in m");}
}
Есть ли способ, которым мы можем позвонить Inner.m из PrivateClassMethodLookupTest? МетодHandles.lookup() .findSpecial (....) не работает – nantitv
Это возможно с использованием отражения API Метод объявленMethod = PrivateClassMethodLookupTest.Inner.class.getDeclaredMethod ("m"); объявилMethod.setAccessible (true); МетодHandle mh = MethodHandles.lookup(). Unreflect (объявилMethod); mh.invoke (новый PrivateClassMethodLookupTest.Inner()); – D0dger
Знаете ли вы, почему это невозможно с findSpecial? – nantitv