【问题标题】:Meta Model library for Java ProgramsJava 程序的元模型库
【发布时间】:2020-02-14 08:41:24
【问题描述】:

也许这里有人知道一个库可以满足我的需求,因为我找不到任何真正做这些事情的库,但我确信这已经完成了。

所以基本上我想要一个可以读取整个项目或一次只读取一个 .java 文件的库,然后给我某种类的元模型。

所以基本上像

MetaClass c = MetaParser.parse(X.java);
MetaMethod[] methods = c.getMethods();
MetaAttribute[] attributes = c.getAttributes();

System.out.println("Class " + c.getClassname() + " has " + methods.length + " methods.");

所以我可以通过获取所有方法、所有属性等来分析该类。基本上在某种程度上类似于该类的面向对象表示。

【问题讨论】:

  • 为什么不使用java.lang.reflect?似乎它完全符合您的要求。

标签: java


【解决方案1】:

在 cmets 中提到了反射。这是一个更详细的示例,说明如何使用它来实现您想要的:

假设您想了解更多关于 Main 的课程:

可以获取类的包:

Main.class.getPackage().getName();

类的方法:

Method[] methods = Main.class.getDeclaredMethods();
Method[] pMethods = Main.class.getMethods(); //only gets the public methods
for(Method m: pMethods) { //print methods and their parameters
   System.out.println("Method " + m.getName() + ", with parameters: ");
   Arrays.asList(methods[0].getParameters()).forEach(p -> System.out.print(p.getName()+","));
}

构造函数类似:

Constructor<?>[] constructors = Main.class.getConstructors();

您甚至可以使用它们创建对象。对于字段,有

Field[] fields = Main.class.getDeclaredFields();
Field[] pFields = Main.class.getFields(); //only public fields

至于如何在运行时实际添加要检查的类,例如可以参考this问题。

【讨论】:

    【解决方案2】:

    如果您打算分析编译代码(字节码、*.class 文件),那么上面 Gtomika 的回答是正确的 - 标准反射 API 足以开始。

    但是,如果您想分析 java 源代码(*.java 文件),我建议您使用像 javaparser 这样的库

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2016-07-02
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      相关资源
      最近更新 更多