我如何获得java反射方法对象的`signature`字段

时间:2017-07-13 05:42:52

标签: java reflection

我使用ASM在另一个Interface上构建类文件,我可以使用java反射来获取static void Main(string[] args) { REngine.SetEnvironmentVariables(); // <-- May be omitted; the next line would call it. REngine engine = REngine.GetInstance(); // A somewhat contrived but customary Hello World: CharacterVector charVec = engine.CreateCharacterVector(new[] { "Hello, R world!, .NET speaking" }); engine.SetSymbol("greetings", charVec); engine.Evaluate("str(greetings)"); // print out in the console string[] a = engine.Evaluate("'Hi there .NET, from the R engine'").AsCharacter().ToArray(); Console.WriteLine("R answered: '{0}'", a[0]); Console.WriteLine("Press any key to exit the program"); Console.ReadKey(); engine.Dispose(); } 的方法,但我需要获取它的签名。 enter image description here

我发现它是一个私人领域,并没有直接的方法来获得它。有什么出路吗?我用jdk7。 推进。

2 个答案:

答案 0 :(得分:1)

如果你想要的只是signature的{​​{1}}字段,那很简单:

java.lang.reflect.Method

其中java.lang.reflect.Field f = java.lang.reflect.Method.class.getDeclaredField("signature"); f.setAccessible(true); String sigature = f.get(yourMethod); 是Method对象。

请记住:签名字段仅表示泛型方法的签名,因此尝试获取非泛型方法的签名只会返回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

答案 1 :(得分:-3)

替换“。”带有'/'的答案使答案完整:

... .toString().replace('.', '/');