2014-12-30 12 views
0

Я хотел бы сделать так, что-то вроде этого:Получить аннотацию ссылки функции

foo(functionOfSomeObject) 
{ 
    call functionOfSomeObject; 
    get some annotations of functionOfSomeObject; 
} 

Я не хочу использовать Method класс пройти functionOfSomeObject, как это должно быть извлечено с помощью строк/отражения. Вместо этого я хотел бы использовать функциональный интерфейс и лямбда-выражения, такие как myObject::method. Но есть ли способ получить аннотации метода с помощью этого подхода?

Благодарим за помощь!

+0

Я не верю, что вы можете это сделать ... –

+2

Ссылки на методы - это всего лишь сахар. Нет никаких метаданных, связанных с ними в приемнике, поскольку все, что вы возвращаете, является экземпляром функционального интерфейса. Используйте отражение. –

+0

Ну, я подозревал это. Мне просто не нравятся методы ссылок по строкам. – Milad

ответ

1

Ваш метод foo получает значение некоторого типа. Учитывая

void foo(FunctionalInterface func) {} 

вы можете вызвать его в любом числе путей

foo(SomeType::someMethod); 
foo(() -> {}); 
foo(new SomeImpl()); 

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

Используйте отражение, чтобы получить необходимую информацию. Обратите внимание, что с помощью ссылки на метод компилятор переносит его в метод, предоставляемый функциональным интерфейсом, поэтому вы в основном теряете метод, на который ссылается (с точки зрения отражения). Вам нужно сделать это за пределами foo, где у вас есть доступ к методу.