2013-10-07 1 views
0

Я использую java-инструменты и ASM для манипулирования java-байтовым кодом. Как узнать, является ли функция статической?Как узнать, является ли метод статическим с помощью инструментария Java и ASM

Я пробовал использовать Modifier.isStatic, но я не могу запустить его внутри инструментария. Могу ли я узнать это с помощью функций ASM?

Мне это нужно, чтобы получить аргументы функции. Если функция не статична, этот объект находится в индексе 0 в стеке

ответ

0

Я бы предложил посмотреть на localVariableNodes рассматриваемого MethodNode. Если первая переменная в списке, которую вы получаете от вызова «MethodNodeName» .localVariables, является экземпляром класса, к которому принадлежит MethodNode, тогда MethodNode не является статическим и наоборот.

Чтобы получить параметры метода используют этот

String raw = Arrays.toString(Type.getArgumentTypes("MethodNodeName".desc)); 
int numParams = (Arrays.asList(raw.split(",[ ]*"))).size(); 

это вернет количество Params в методе. Поскольку первыми переменными, помещенными в список localVariable, являются параметры, это простой вопрос для извлечения первых переменных [1, numParams] для получения параметров.

Для примера, приведенного

public void methodName(int arg0, int arg1){ ....} 

первых три переменных в локальном переменном списке будет начиная с индексом 0 («объект типа, который принадлежит методу», «объект типа Int», «объект типа ИНТ», ....)

, где в качестве

public static void methodName(int arg0, int arg1){ ....} 

даст ("объект типа ИНТ", "объект типа ИНТ", ...)

Обратите внимание, что это делает предположение, что рассматриваемый метод не принимает в качестве своего первого параметра объект класса, к которому принадлежит метод.

веселит

EDIT:

В качестве альтернативного решения вы можете проверить, чтобы увидеть, если localVariableNodes.get (0) .equals ("это") верно; Если это правда, метод не статичен и наоборот. Если метод не имеет локальных переменных, то метод является статическим

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

  • Нет связанных вопросов^_^