如何在不使用class.getDeclaredMethod的情况下获取方法的名称

时间:2013-12-22 14:11:30

标签: java

如何才能获得方法的名称,就像我可以获得类的名称一样? (RandomClass.class.getName())

硬编码不起作用,因为混淆器会破坏它。

原因: 我正在注入这样的方法:

        MethodNode getLocalPlayer = GetterAdapter.insert(false, true, "getLocalPlayer", "Lvanquish/accessors/Player;", "client", "yD", "LQZ;");
        classNode.methods.add(getLocalPlayer);

        //class client implements my interface which contains the method getLocalPlayer

      public interface Client {

         public int[] getPlayerIndices();

         public Player getLocalPlayer();

         public Player[] getPlayers();

         public int getBaseX();

         public int getBaseY();

         public int getCameraX();

         public int getCameraY();

      }

        //when I obfuscate my files getLocalPlayer get's a name like a2
        //when you look above you see that the method name was hard code and so
        // will it create an error

声明的方法在这里不起作用,因为我不知道方法名称,并且有4个相同类型的变量。

这会起作用还是乱七八糟?

    @DataMap.varDetails(name = "getPlayerIndices")
public int[] getPlayerIndices();

2 个答案:

答案 0 :(得分:0)

你需要你想要引用的每个方法反射性地做这样的事情:

static String baseXName;

public int getBaseX() {
  if (baseXName == null)
    baseXName = detectMyName();
  ... the actual code of the method ...
}
正如@eran在您的问题的第一条评论中建议的那样,

detectMyName()将实例化Exception并从其堆栈跟踪中检索调用方法的实际运行时名称。如果调用Thread.currentThread().getStackTrace(),则可以通过获取堆栈跟踪而不实例化异常来避免一点点开销。

答案 1 :(得分:0)

你可以试试这个:

Thread.currentThread().getStackTrace();

它会显示当前线程中您的调用方法的堆栈 祝你好运:)