Получение объекта метода без адресации метода по имени - PullRequest
3 голосов
/ 14 марта 2011

Есть ли способ получить объект метода без необходимости использовать имя метода для его получения?

Например, у меня есть класс:

class Car {

    public String drive();
    public String giveUp();
    public String fillUp();
}

Я хотел бы создатьMap<String, Method> методов (aka: ("move", drive ()), ("name", giveUp ()), ....).

Я не могу получить объект метода по имени из-за использования запутывания.Есть ли способ получить имя метода, не связывая это?

Полагаю, можно задать другой вопрос:

Для класса, у которого есть getClass (), есть ли эквивалент для методов?Я ищу что-то по всем линиям GiveUp.Method.

Ответы [ 2 ]

4 голосов
/ 14 марта 2011

В Java нет такой конструкции, как Car.giveUp.method(), потому что методы не являются "первоклассными гражданами", такими как классы и объекты.

Не зная, что обфускатор делает с вашим кодом, или добавляя дополнительную информацию, вы не сможете различить методы, потому что кроме их имени они имеют одинаковую подпись.

  • Некоторые обфускаторы создают текстовые файлы, которые сопоставляют оригинальное имя с обфусцированным именем, и вы можете использовать этот файл карты для идентификации запутанного метода во время выполнения.

  • Вы можете добавить аннотацию к методу, например

    @MappedMethod("move")
    public String drive();
    

    с собственноручной аннотацией @MappedMethod и атрибутом по умолчанию типа String. Затем используйте отражение, чтобы получить все методы и их аннотации, и используйте значение аннотации в качестве ключа.

3 голосов
/ 14 марта 2011

Вы можете использовать Reflection, чтобы получить все методы.

Class<Car> clazz = Car.class;
Method[] methods = clazz.getDeclaredMethods();

Те, у кого вы перебираете методы и отображаете их:

for(Method method: methods)
    map.put( method.getName(), method);
...