- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望能够使用 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/
我尝试实现此正则表达式来检查字符串("username")的长度是否在3到30之间,是否仅包含字母(a-z),数字(0-9)和句点(.)(不连续): use regex::Regex; // 1.3.
我又在与正则表达式作斗争了。我一直在尝试添加使用转义字符来转义自定义标记,例如 至 和 至 .在乔治的帮助下,here , 在尝试转义方法之前,以下表达式会产生所需的结果。 ('This is a
我试图根据Python中的正常语法规则正确地分割句子。 我要拆分的句子是 s = """Mr. Smith bought cheapsite.com for 1.5 million dollars,
我有以下将字符串与模式匹配的正则表达式: (?i)(?
我想使用正则表达式过滤掉不使用“\r\n”作为换行符的文件。例如,如果文件包含单个“\n”或单个“\r”,则将被过滤为不合格文件。 我已经找到了: new Regex(@"(?
我正在尝试编写一个正则表达式替换模式,以便替换散列中的数字,如下所示: regexr link some_dict = { TEST: 123 } 这样就可以捕获和替换 123 个。(? " T
因此,我正在使用此查询查询Logstash,该查询返回堆栈顶部的所有内容: { "query": { "match_all": { } }, "size": 7, "_source": { "incl
我正在为 Android 开发 html/javascript 游戏。这是一款棋盘游戏,具有以下功能。它具有不同颜色的图 block ,用户可以在板上放置一个图 block (以编程方式选择)。如果我
所以我目前正在尝试创建一个函数,它将采用两个 3D 点 A 和 B,并为我提供代表 A 点“观察”B 点所需的旋转的四元数(这样点 A 的局部 Z轴穿过点 B,如果你愿意的话)。 我最初找到了this
比如: 第一个数字是:1。 看着第一个数字你可以说1个1,那么第二个数字就是:11。 看着第二个数字你可以说2个1,即第三个数字是:21。 看着第三个
基本上,要点在主题中。 当我创建两个具有固定高度 (2px) 的相同 div,并将缩放比例更改为 75% 或 125% 时,由于某种原因它们“看起来”不同,有人可以解释一下这里发生了什么吗?我该如何解
我正在使用 chrome://inspect/#devices通过cordova检查我的android-app构建的WebView。它在我的 Mac 上运行模拟器。可以找到该设备,但如果我在 WebV
如何使 Angular 服务代码“看起来同步”? 当我清理 Controller 并将业务逻辑代码放入服务中时,我的问题出现了。到目前为止,一切都很好。现在我想在服务函数中“等待”,直到所有异步调用都
标准的 Delphi 控件(面板、按钮等)都有这种斜角效果(顶部和左侧的白线),这给它们带来了 3D 感觉,但今天这让它们看起来很老式。 有没有办法至少在 Delphi 7 中删除这种“3D 外观”?
我有一个在 Win7 上使用 JFileChooser 的 java 应用程序。奇怪的是,有时(经常)但并非总是如此 - 驱动器名称在“查找范围:”组合框中看起来很奇怪: 有没有人知道是什么原因造成的
正在处理一些2015 AoC学习 clojure 的问题...下面的代码对于第 40 次迭代来说足够快,但在那之后很长时间就陷入了停滞。我与其他一些人的解决方案进行了比较,但我并不清楚为什么这么慢。我
我有一个在 Win7 上使用 JFileChooser 的 java 应用程序。奇怪的是,有时(经常)但并非总是如此 - 驱动器名称在“查找范围:”组合框中看起来很奇怪: 有没有人知道是什么原因造成的
我从 JUnit 开始,尝试找到测试的最佳断言方法。 假设我有一个函数来测试它 不返回值 如果输入无效则抛出异常 例如 void foo (int a) throws Exception { if
为了我的优化,我想在 Rcpp 中获得一个像样的 toupper。我对 C++ 很陌生,据我所知,我已经做到了: #include using namespace Rcpp; void C_toup
我在这里不知所措。我有一个简单的地形生成算法在工作,并且通过扩展 ViewPlatformAWTBehavior 和处理我自己的事件,我有一些简单的键盘导航在工作。一切都很好,我可以跟随地形。万岁!
我是一名优秀的程序员,十分优秀!