2016-04-13 8 views
1

Что заменить foo() на?Получить имя класса по статическому методу

class MethodIteration { 
    public static void main(String[] args) { 
    for (MyFuncInt m : new MyFuncInt[] { Class1::method, Class2::method }) 
     System.out.println(m.getClass().foo()); // want Class1, Class2 etc here 
    } 
} 

Извините за краткость. Мобильное устройство;)

Я не думаю, что это дубликат упомянутого вопроса, так как я хочу получить имя за пределами класса, содержащего статический метод. Если я попробую m.getClass().getName(), я получаю «MethodIteration $$ Lambda $ 1: [someHash]».

ответ

0

Боюсь, вы не можете. Звонки на Class1::method, Class2::method завернуты в лямбда-закрытие, которое реализует MyFuncInt, у которого нет методов доступа к обернутому классу (это даже не объявленное поле класса лямбда).

Я бы сказал, что вы не можете использовать функциональный интерфейс. Вы должны были бы сделать функтор, к которому вы передаете ссылку на класс (или просто строка с именем класса), так что вы можете получить его позже:

class MyFunctor implements MyFuncInt { 

    public final Class<?> clazz; 
    private final MyFuncInt func; 

    public MyFunctor(Class<?> clazz, MyFuncInt func) { 
     this.clazz = clazz; 
     this.func = func; 
    } 

    @Override 
    public void doSomething() { 
     func.doSomething();  
    } 
} 

Тогда как экземпляр:

new MyFunctor(Class1.class, Class1::method); 
+0

Это было «как боялось», но спасибо :) – carlsb3rg

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