2016-01-13 3 views
2

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");} 
} 

ответ

1

Вы в состоянии вызвать его, потому что у вас есть доступ к частным методам из того же класса, где main выполняется Попробуйте запустить этот код:

package com.company; 

import java.lang.invoke.MethodHandle; 
import java.lang.invoke.MethodHandles; 
import java.lang.invoke.MethodType; 

public class PrivateClassMethodLookupTest { 
    public static void main(String[] args) throws Throwable { 
     new PrivateClassMethodLookupTest.Inner().m(); 
     MethodHandle mh = MethodHandles.lookup() 
       .findVirtual(PrivateClassMethodLookupTest.Inner.class, "m", MethodType.methodType(void.class)); 
     mh.invoke(new PrivateClassMethodLookupTest.Inner()); 
    } 

    static class Inner { 
     private void m() { 
      System.out.println("in m"); 
     } 
    } 
} 

Для вызова частных методов, которые вы должны использовать Reflection API и метод доступа метод доступа:

package com.company; 

import java.lang.invoke.MethodHandle; 
import java.lang.invoke.MethodHandles; 
import java.lang.reflect.Method; 

public class PrivateClassMethodLookupTest { 
    public static void main(String[] args) throws Throwable { 
     new PrivateClassMethodLookupTest.Inner().m(); 
     Method declaredMethod = PrivateClassMethodLookupTest.Inner.class.getDeclaredMethod("m"); 
     declaredMethod.setAccessible(true); 
     MethodHandle mh = MethodHandles.lookup().unreflect(declaredMethod); 
     mh.invoke(new PrivateClassMethodLookupTest.Inner()); 
    } 

    static class Inner { 
     private void m() { 
      System.out.println("in m"); 
     } 
    } 
} 
+0

Есть ли способ, которым мы можем позвонить Inner.m из PrivateClassMethodLookupTest? МетодHandles.lookup() .findSpecial (....) не работает – nantitv

+1

Это возможно с использованием отражения API Метод объявленMethod = PrivateClassMethodLookupTest.Inner.class.getDeclaredMethod ("m"); объявилMethod.setAccessible (true); МетодHandle mh = MethodHandles.lookup(). Unreflect (объявилMethod); mh.invoke (новый PrivateClassMethodLookupTest.Inner()); – D0dger

+0

Знаете ли вы, почему это невозможно с findSpecial? – nantitv

 Смежные вопросы

  • Нет связанных вопросов^_^