Как сгенерировать подпись метода?

Рекомендуемые примеры вывода:

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

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

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

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

Ответ 1

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 или карту.

Ответ 2

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

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

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

Ответ 3

Пользовательская библиотека ASM Objectweb. Его не только быстро, но и у вас может быть выбор по прохождению через класс

Ответ 4

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;
    }