gpt4 book ai didi

Java反射: looking at the lines of code in a method?

转载 作者:行者123 更新时间:2023-11-30 03:56:59 24 4
gpt4 key购买 nike

我希望能够使用 java 反射(或任何其他可能存在的方法)提取方法的内部。

我有一个测试数据,我正在生成不同样式的图表。我希望能够显示图表,然后在它旁边的面板中显示创建该图表的 java 代码。

我需要做的就是进入这些方法,并提取内部内容。反射允许这样做吗?

chart = TestData.createChart1();
chart.display()
chart = TestData.createChart2();
chart.display()
chart = TestData.createChart3();
...
chart = TestData.createChartN();
chart.display()

在我的方法之一中,我可能有这样的东西:

public static PieChart createChart1() {

//I WANT ALL THE CODE FROM HERE....

ArrayList<Segment> values = new ArrayList<Segment>();
values.add(new Segment(0, null, 15, "music", Color.RED));
values.add(new Segment(0, null, 52, "photos", Color.BLUE));
values.add(new Segment(0, null, 33, "applications", Color.GREEN));

PieChart pieChart = new PieChart(values, "Disk Space Usage");

pieChart.width = 600;
pieChart.height = 600;
pieChart.topOffset = 50;
pieChart.leftOffset = 50;
pieChart.rightOffset = 50;
pieChart.bottomOffset = 50;
pieChart.initialWidth = 100;
pieChart.incrementWidth = 50;

//TO HERE....

return pieChart;
}

最佳答案

反射的好处是它使程序可以访问其源代码的某些方面。不太好的部分是,你能得到什么是由语言设计者和实现者决定的,因此受到限制。原始源代码是他们合理不想提供的一部分。如果他们这样做,每个编译的反射系统都将包含其源代码,这将造成巨大的知识产权泄漏。

如果您希望以编程方式访问计算机程序(包括 Java 程序)的全部内容,可以使用名为 Program Transformation 的工具类。 (PTS) 系统是理想的。这些工具通常旨在解析感兴趣的源代码语言,构建包含完整等效源代码(通常包括精确的源代码位置信息)的内部编译器数据结构(通常是抽象语法树或 AST)。从OP的角度来看,真正有用的部分是PTS通常可以反转解析过程,并从内部结构重新生成源(或指定部分)。作为一种替代方案,可以使用精确的源位置信息从原始文件中提取原始文本;这通常仅在您关心精确格式和/或空白中的内容时才有用。

要使用我们的 DMS 软件重组工具包获得 OP 的效果,需要使用 DMS 的 Java 前端,并使用大致以下代码编写自定义工具:

       (include `Java~v7/ParserComponent.par')
...
(local (;; [myFile string]
[myTree AST:Tree]
);;
...
(= myFile ... ) ; get a file path from somewhere
(= myTree (ParserComponent:Parse myFile ...))
(AST:ScanTree myTree
(procedure [subtree AST:Tree]
(;; (ifthen (== (AST:subtree Grammar:Nonterminals:_method_declaration))
(;; (ParserComponent:PrettyPrintFidelity
(AST:GetNthGrammarChild myTree 3) ; the method body
...
)
);;
)

(return ~t) ; signal to ScanTree to continue looking
);;
)
)AST
)local

请注意,树扫描(将其视为访问者)会寻找“method_declaration”类型的 AST 节点,该术语字面上取自 Java 语法。找到这样的 AST 节点类型后,它会导航到方法主体并调用 DMS 的 beautifulprinter 以 Fidelity 模式重新生成文本,从而从原始源代码中重现原始缩进和换行符以及注释。 [所有这些信息都在 DMS 的树中]。

如果OP想要一个专门命名的方法;他将使用 DMS 的 NameResolver 组件,该组件构建一个完整的符号表,其中包括每个定义对提供定义的源代码点的引用(特别是树)。然后可以使用该符号表查找限定名称,获取定义树并打印它。

关于Java反射: looking at the lines of code in a method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22914964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com