获取方法对象而不按名称寻址方法

时间:2011-03-14 20:23:55

标签: java reflection obfuscation

有没有办法获取方法对象而不必使用方法的名称来抓取它?

例如我有课程:

class Car {

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

我想创建一个Map<String, Method>方法(又名:(“move”,drive()),(“name”,giveUp()),....)。

由于使用了模糊处理,我无法通过名称获取方法对象。有没有办法获取方法名称而不必绑定它?

我想另一种问这个问题的方法是:

对于你有getClass()的类,是否有方法的等价物?我正在寻找像giveUp.Method一样的东西。

2 个答案:

答案 0 :(得分:4)

Java中没有Car.giveUp.method()这样的构造,因为方法不像类和对象那样是“一等公民”。

在不知道混淆器对您的代码做什么或添加其他信息的情况下,您无法区分这些方法,因为除了名称之外,它们具有相同的签名。

  • 有些混淆器生成将原始名称映射到混淆名称的文本文件,您可以使用该映射文件在运行时识别混淆方法。

  • 您可以为方法添加注释,例如

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

    使用自编注释@MappedMethod和类型为String的默认属性。然后使用反射来获取所有方法及其注释,并使用注释值作为关键。

答案 1 :(得分:3)

您可以使用Reflection来获取所有方法。

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

他们迭代方法并映射它们:

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