Как сгенерировать подпись метода?
Рекомендуемые примеры вывода:
(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;
}