gpt4 book ai didi

java - 如何获取 java 反射方法对象的 `signature` 字段

转载 作者:行者123 更新时间:2023-12-01 14:34:31 27 4
gpt4 key购买 nike

我正在使用 ASM 基于另一个 Interface 构建类文件,我可以使用 java 反射来获取 Interface 的方法,但我需要得到它的签名。
enter image description here

我发现这是一个私有(private)领域,没有直接的方法可以得到它。有什么出路吗?我用 jdk7 。
tks提前。

最佳答案

如果你想要的只是 signature java.lang.reflect.Method 的字段,这很简单:

java.lang.reflect.Field f = java.lang.reflect.Method.class.getDeclaredField("signature");
f.setAccessible(true);
String sigature = f.get(yourMethod);

在哪里 yourMethod是一个方法对象。

请记住:签名字段仅表示泛型方法的签名,因此尝试获取非泛型方法的签名将仅返回 null .

例如,让我们评估以下方法:
public static <T> void test(Class<T> c){}

这将返回 <T:Ljava/lang/Object;>(Ljava/lang/Class<TT;>;)V 的签名

这表明该方法声明了一种泛型类型
必须至少继承 java.lang.Object并将该类型的类作为参数。

但是,假设我们要从方法中删除泛型:
public static void test(Class c){}

这将导致 signature字段为 null .

编辑:

如果您想获得任何方法的签名(通用或非通用),有几种方法可以做到,但我发现以下是最简洁的(虽然可能很笨重):
public static String getSignature(Method m){
String sig;
try {
Field gSig = Method.class.getDeclaredField("signature");
gSig.setAccessible(true);
sig = (String) gSig.get(m);
if(sig!=null) return sig;
} catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
}

StringBuilder sb = new StringBuilder("(");
for(Class<?> c : m.getParameterTypes())
sb.append((sig=Array.newInstance(c, 0).toString())
.substring(1, sig.indexOf('@')));
return sb.append(')')
.append(
m.getReturnType()==void.class?"V":
(sig=Array.newInstance(m.getReturnType(), 0).toString()).substring(1, sig.indexOf('@'))
)
.toString();
}

关于java - 如何获取 java 反射方法对象的 `signature` 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45072268/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com