2013-12-22 6 views
0

Как я могу получить имя метода, как будто я могу получить имя класса? (RandomClass.class.getName())Как получить имя метода без использования class.getDeclaredMethod

Hardcoding не будет работать, потому что обфускатор уничтожает его.

Причина: методы Я инъекционные, как это:

 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(); 
+3

Вы можете выбросить исключение, поймать его и посмотреть на трассировку стека. Просто шутите, не ... – eran

+0

http://stackoverflow.com/questions/3864175/how-to-get-the-name-of-method-in-current-class?rq=1 – MGorgon

+1

Зачем вам нужно к? (Это звучит как проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

ответ

0

Вы должны были бы каждый из методов, которые вы хотите сослаться на рефлекторно сделать что-то вроде этого:

static String baseXName; 

public int getBaseX() { 
    if (baseXName == null) 
    baseXName = detectMyName(); 
    ... the actual code of the method ... 
} 

и detectMyName() бы, как и @eran предлагает в первом комментарии к вашему вопросу, экземпляр Exception и получить фактическое имя времени вызова вызывающего метода из его stacktrace. Вы можете избежать крошечных накладных расходов, получив stacktrace без создания экземпляра исключения, если вы вызываете Thread.currentThread().getStackTrace().

0

вы можете попробовать это:

Thread.currentThread().getStackTrace(); 

он покажет вам стек вашего вызова метода в текущем потоке.
Удачи :)

Смежные вопросы