【问题标题】:Extracting the Java method text [closed]提取Java方法文本[关闭]
【发布时间】:2009-07-25 16:24:58
【问题描述】:

我制作了一个工具来测量 Java 源文件的一些内聚指标,但这些指标取决于您可以确定方法访问的属性列表,为此我制作了一个解析器来提取方法代码,但是我遇到了一些问题,所以我问是否有任何工具可以解析Java文件并将方法代码提取为文本?

谢谢,

【问题讨论】:

  • 您能否提供一个代码示例,准确说明您拥有什么以及想要做什么?
  • 被访问的属性到底是什么意思?你是说字段吗?

标签: java code-analysis metrics


【解决方案1】:

我怀疑你问的就是你想要的。假设您有源代码,那么您将如何确定访问的属性列表?

相反,您确实需要遍历字节码,并寻找 getfield 和 setfield 操作码。 BCEL 是做到这一点的正确方法。

【讨论】:

    【解决方案2】:

    您可能会对 Eclipse AST Parser 感到满意。

    你可以这样使用它:http://www.ibm.com/developerworks/opensource/library/os-ast/

    【讨论】:

      【解决方案3】:

      一个相当古老的反编译java-classes的工具是jad。它可以在 jdk 1.5 之前正常工作。

      【讨论】:

      • 非常感谢您的回答,但我不需要反编译器,实际上我想将类中的每个 Method 对象关联到包含方法文本的字符串,例如如果我有这个类: ClassA{ void m1 { int x;}} 然后我需要一个 java 库,它可以为在反射中生成的方法 m1 制作类似包装器的东西,以包含一个 text = { int x;}} 代表方法代码。我尝试使用 com.sun.org.apache.bcel 但无法使用 com.sun.org.apache.bcel.internal.classfile.Method 类中的可用方法提取方法代码 谢谢
      • 你的意思是,ClassA的包装器能够知道ClassA的每个方法的源代码?
      • 是的,完全正确。在普通反射框架中,Method 类具有知道方法签名的属性和方法,但没有任何方法来检索方法代码,所以我制作了一个手动代码,它是反射框架的包装器,为每个 Method 对象分配一个 String 代表方法代码,但我在代码中发现了一些问题,使我为此寻找任何现有的测试工具。
      【解决方案4】:

      处理类文件可能确实更容易(更多工具),但似乎也有一些 Java 源解析器。 “javaparser”看起来不错:http://code.google.com/p/javaparser/

      【讨论】:

      • 感谢您的回复,我的主要问题是,如果我有一个方法m,我想获取该方法访问的属性列表,以及方法m调用的其他方法的列表,这就是为什么我认为解析代码文件是一种好方法,但是如果你知道更简单的方法,告诉我它会很有帮助,这也可以通过普通的反射框架或 com.sun 来实现。 org.apache.bcel 框架?谢谢,
      • 我自己还没有做过这样的事情,注意反射不是方法,因为你首先需要能够加载有问题的类,你将无法自省方法本身。也回答的 Martin v. Löwis 似乎对 BCEL 有一些经验。
      【解决方案5】:

      使用 ASM 可以很容易地“分析”一个你想要的类。如果我理解正确,要解决您的问题,您基本上写一个访问者并注意所述方法中的字段。

      【讨论】:

        【解决方案6】:

        要获得方法体的详细信息,您需要一个 Java 解析器。要了解 Java 代码中的每个符号代表什么,您需要能够为每个方法/类/包构建相当于符号表的东西。

        Java Front End 是一个功能齐全的 Java 解析器,它为一组 Java 源文件构建符号表(对不可用的源使用类文件)。 Java 前端构建 AST,可用于将这些 AST 拆分为方法的子树,并且漂亮的打印机可以重新生成每个方法(包括任何 cmets)的文本。这一切都建立在程序转换系统 DMS 之上。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-10
          • 2013-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-13
          相关资源
          最近更新 更多