2016-04-13 49 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的lambda閉包中,該閉包沒有方法來訪問被包裝的類(它甚至不是lambda類的聲明字段)。

我會說你不能使用功能接口。你必須做一個函子來,你傳遞給類的引用(或者只是一個類名字符串),這樣你就可以在以後檢索:

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