Как сгенерировать сигнатуру метода? - PullRequest
10 голосов
/ 16 декабря 2010

Желаемые примеры вывода:

(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;
(Ljava/lang/String;)Lorg/w3c/dom/Attr;

Такие подписи могут быть сгенерированы с помощью утилиты javap:

javap -s -p org.w3c.dom.Node

Но есть ли способ генерировать их программно. Я не хочу вручную кодировать все правила из спецификации jni .

Ответы [ 4 ]

4 голосов
/ 04 марта 2012

http://asm.ow2.org/asm31/javadoc/user/org/objectweb/asm/Type.html#getMethodDescriptor%28java.lang.reflect.Method%29 дает именно тот результат, который вы ожидаете.

Оффтоп примечание ради полноты: В моем случае использования мне также требовалось преобразование наоборот. Это может быть достигнуто методами Type.getArgumentTypes (sig) и Type.getReturnType (sig). Результирующие элементы массива типа Type предоставляют метод getClassName (), из которого вы получаете ссылочный класс с помощью Class.forName или примитивный класс с помощью простого оператора if или карты.

1 голос
/ 24 октября 2016
I generate like this:

private static String calculateMethodSignature(Method method){
        String signature = "";
        if(method != null){
            signature += "(";
            for(Class<?> c:method.getParameterTypes()){
                String Lsig = Array.newInstance(c,1).getClass().getName();
                signature += Lsig.substring(1);
            }
            signature += ")";

            Class<?> returnType = method.getReturnType();
            if(returnType == void.class){
                signature += "V";
            }else{
                signature += Array.newInstance(returnType,1).getClass().getName();
            }

            signature = signature.replace('.','/');
        }

        return signature;
    }
1 голос
/ 16 декабря 2010

Я однажды пытался создать этот длинный назад о генерации сигнатуры метода, я помню, как делал это следующим образом, но я не уверен, что это тихое долгое время

1) Я написал свой собственный класс для генерации сигнатуры метода 2) Я использовал класс отражения для динамического получения метода Names.

Надеюсь, это поможет вам понять, если не полное решение вашей проблемы

0 голосов
/ 16 декабря 2010

Пользователь ASM Библиотека Objectweb. Это не только быстро, но вы можете выбрать прохождение класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...