【问题标题】:Paranamer does not return parameter namesParanamer 不返回参数名称
【发布时间】:2013-06-20 01:35:49
【问题描述】:

我正在使用 paranamer.jar 来获取方法的参数名称。但它没有得到任何参数名称。

    Class c = Class.forName("com.soa1.MyClass");
    Class[] argTypes = { java.lang.String.class };
    Method method=ABC.class.getMethod("getData",argTypes);
Paranamer paranamer = new CachingParanamer();
    String[] parameterNames = paranamer.lookupParameterNames(method,false);

【问题讨论】:

  • 你的代码编译时是否开启varnames
  • 不,我该怎么做。请告诉我
  • 看看this question,但这取决于你如何编译你的代码;你在使用 IDE 吗?你是从命令行编译的吗?
  • 我正在使用 Eclipse。有什么可以更改的设置吗?
  • 要在类文件中保留名称以进行调试,请尝试:“项目属性”->“Java 编译器”->“将变量属性添加到生成的类文件”。但也请阅读@Chris 的回答以了解其他可能的解决方案

标签: java reflection


【解决方案1】:

参数名称是否来自某处?根据 ParaNamer 的文档,它使用几种方法来获取参数名称:

  1. 通过__PARANAMER_DATA 字段。显然,这只有在您的班级有这样的字段时才有效。
  2. 通过.class 文件中的调试信息。显然,这仅在您的类使用调试信息编译时才有效。
  3. 通过@Named 注释。显然,这仅在您的方法参数包含此类注释时才有效。

如果这些都不适用于您的类,那么很抱歉,参数名称将不可用。

【讨论】:

  • 我正在关注选项 2。但它仍然不起作用。我的eclipse中有以下设置。 “项目属性” -> “Java 编译器” -> “将变量属性添加到生成的类文件”
【解决方案2】:

使用这个:

Paranamer paranamer = new AdaptiveParanamer();

改为:

Paranamer paranamer = new CachingParanamer();

如果还没有工作,请告诉我,因为我在使用 paranamer 时也遇到了问题 - 在一位巴西朋友的帮助下,我了解了它是如何工作的。再见!

【讨论】:

    【解决方案3】:

    编译时保留调试信息

    如果您使用 Eclipse 进行编译,请选中将调试信息保留在 project-properties-java 编译器中的选项

    如果你使用 javac 编译添加 -g 选项

    并在您的代码中使用 Paranamer paranamer = new AdaptiveParanamer();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多