当前位置: 首页 > 知识库问答 >
问题:

如何获取java反射方法对象的'signatury'字段

黄弘盛
2023-03-14

我发现这是一个私人领域,没有直接的方法来获得它。有办法出去吗?我使用jdk7。tks前进。

共有1个答案

姚永年
2023-03-14

如果您只想要java.lang.reflect.methodsignatury字段,那很简单:

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){}

这将返回 (ljava/lang/class ;)v 的签名

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

public static void test(Class c){}

编辑:

如果您想要获得任何方法的签名(不管是不是泛型的),有几种方法可以做到这一点,但我发现以下方法是最简洁的(尽管可能有些笨拙):

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中有一个对象(基本上是VO),但不知道其类型。 我需要获取在该对象中不为null的值。 如何才能做到这一点? 问题答案: 你可以用来获取该类的所有声明的字段。你可以用来获取价值。 简而言之: 要了解有关反射的更多信息,请查看有关该主题的Sun教程。 就是说,这些字段不一定全部代表VO的属性。你希望确定以或开头的公共方法,然后调用它以获取真实属性值。 也就是说,可能会有更优雅

  • 问题内容: 说,我有一个方法返回带有一些对象的自定义。他们归还了我。我需要从这些对象中获取某个字段的值,但是我不知道这些对象的类。 有没有办法通过Reflecion或其他方式做到这一点? 问题答案: 假设一个简单的情况,您的字段是: 但这很丑陋,我省略了所有尝试,并提出了许多假设(公共领域,可用的反射,不错的安全管理器)。 如果您可以更改返回a的方法,这将变得非常容易,因为迭代器随后可以为您提供类

  • 本文向大家介绍Java反射之通过反射获取一个对象的方法信息(实例代码),包括了Java反射之通过反射获取一个对象的方法信息(实例代码)的使用技巧和注意事项,需要的朋友参考一下 以下代码为一个工具类 以下代码为测试类: 截图如下:   以上就是小编为大家带来的Java反射之通过反射获取一个对象的方法信息(实例代码)的全部内容了,希望对大家有所帮助,多多支持呐喊教程~

  • 比方说,我有一个方法,返回一个自定义的与一些对象。它们作为返回给我。我需要从这些对象中获取某个字段的值,但是我不知道对象的类。 有没有办法通过反射或其他方式做到这一点?

  • 问题内容: 我有一个具有String字段的对象。我可以通过致电获得该字段: 我设置了一个方法来设置此实例的字段的值,但是各个getter似乎是,这很奇怪,因为我希望它是。 如何获取实例的值? 问题答案: 如果使用,则“ setter”为,“ getter”为。在 这两种 情况下,第一个参数都是您要在其上访问字段的实例。

  • 问题内容: 考虑以下代码: 我对标有的参数的值感兴趣。假设我已经通过反射(使用)弄清楚了哪个方法参数具有注释。(我知道这是参数列表中的第三个参数。) 现在如何检索值以进一步使用? 问题答案: 你不能 反射无法访问局部变量,包括方法参数。 如果您需要该功能,则需要拦截方法调用,可以通过以下几种方法之一进行操作: AOP(AspectJ / Spring AOP等) 代理(JDK,CGLib等) 在所