所需的输出示例:
(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;
(Ljava/lang/String;)Lorg/w3c/dom/Attr;
可以使用 javap 实用程序生成此类签名:
javap -s -p org.w3c.dom.Node
但是有没有办法以编程方式生成它们。我不想手动编写jni规范中的所有规则。
所需的输出示例:
(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;
(Ljava/lang/String;)Lorg/w3c/dom/Attr;
可以使用 javap 实用程序生成此类签名:
javap -s -p org.w3c.dom.Node
但是有没有办法以编程方式生成它们。我不想手动编写jni规范中的所有规则。
为了完整起见,题外话:在我的用例中,我也需要转换,反之亦然。这可以通过 Type.getArgumentTypes(sig) 和 Type.getReturnType(sig) 方法来实现。生成的 Type 类型的数组元素提供方法 getClassName() ,您可以从中通过 Class.forName 获取引用类或通过简单的 if 语句或映射获取原始类。
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)我已经编写了自己的类来生成方法签名 2)我已经使用反射类来动态获取方法名称。
我希望这可以帮助您获得一个想法,如果不是您问题的完整解决方案
Objectweb 的用户 ASM 库。它不仅速度快,而且您可以选择遍历类