我想实现一个读取文本文件并执行其中每一行的程序。
例如,如果我有这个txt文件:
{
t.getP().getName()
t.getP().getAge()
t.getP().getLocation()
}
以及以下Java程序:
public class Test {
private Person p;
public Test(){
p = new Person("Jhon", "19", "New York", "Mathematician");
}
public Person getP() {
return p;
}
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException{
Test t = new Test();
// Read txt file with methods
String line1 = "t.getP().getName()";
String line2 = "t.getP().getAge()";
String line3 = "t.getP().getLocation()";
// Execute methods
Method m = t.getClass().getMethod(line1);
m.invoke(t);
}
}
我得到以下错误:
Exception in thread "main" java.lang.NoSuchMethodException: Test.t.getP().getName()()
at java.lang.Class.getMethod(Class.java:1786)
at Test.main(Test.java:24)
我知道该程序没有找到任何方法,但我不知道如何修复它。
提前感谢!
当使用Java反射调用方法时,需要传递不带括号的函数名。如果有需要参数的方法,则将这些参数传递给反射方法,而不是正在调用的方法。
假设这些方法存在于您的Person类中,那么从方法名称中删除括号就可以了。此外,正如评论中提到的@UnholySheep,您需要在命令中分解您的行。txt,使每一行都包含您需要调用的正确“命令”。例如:
Method m = Class.forName("Person").getMethod("getName");
解析器应该以类似的方式检索这些参数。如果你注意到你得到的错误,你会注意到最后有两组括号。这是因为API假设方法名称本身包含字符(
和)
。
更新:我不知道是谁否决了这个答案,所以让我更清楚一点。你需要分解你的命令。您还需要从测试类中获取对象p,然后调用Person类的方法。
Method getPerson = t.getClass().getMethod("getP");
Person p = (Person)getPerson.invoke(t);
Method getName = p.getClass().getMethod("getName");
String name = (String)getName.invoke(p);
每个字符串参数可以在单独的行中,也可以在由某些字符分隔的同一行中。例如
getP|getName
getP|get
getP|getAge
getP|getLocation
您甚至可以循环文件中的行,标记每个字符串,并传递引用方法名称数组的参数。
try (BufferedReader br = new BufferedReader(new FileReader(new File("Commands.txt")))) {
String line;
while ((line = br.readLine()) != null) {
String tokens = line.split("|");
Method getPerson = t.getClass().getMethod(tokens[0]);
Person p = (Person)getPerson.invoke(t);
Method getName = p.getClass().getMethod(tokens[1]);
String name = (String)getName.invoke(p);
}
}
总之:
在评论中,您详细说明了您的目标是做一些事情以确定您是否要附加. toString()
。有了这个问题语句,这里有一个完全不同的方法:
. toString()
有些行需要一个。根据您在评论中提到的内容,添加了toString()
,即它是“一种Java的XML转换器,但并不完美”。
有些行不需要它,但可以附加一个<代码>。toString()。例如,这是完全有效的Java:
"aardvark".toString().toString().toString();
问题内容: 我正在尝试从Java代码执行.py文件。我将.py文件移动到Java项目的默认目录中,并使用以下代码对其进行调用: 使用变量run或整个路径或“ python file.py”,我的代码正在运行,显示消息构建成功总时间为0秒,而没有执行file.py。我这是什么问题 问题答案: 您也可以这样使用: 要么 从Java运行Python脚本
问题内容: 我必须从我的Java程序中打开一个.exe文件。因此我首先尝试了以下代码。 但是我遇到了一些错误。然后我发现该exe必须从c:// program files / test /的位置启动,然后才可以正常打开。因此,我决定编写一个.bat文件并执行,以便将其CD到该位置并执行.exe文件。 以下是我的代码: 上面的代码运行完美。但是,命令提示符也在我的.exe(应用程序)的背面打开。仅在
问题内容: 我正在尝试在Jmeter SetUp线程中运行几个SQL脚本。是否可以通过Jmeter从.SQL文件运行SQL代码,以便我可以在执行其他线程之前初始化数据库。我只是不想破坏我的代码,并使用JDBC连接和JDBC请求在Jmeter中复制/粘贴代码。谢谢! 问题答案: __FileToString()函数似乎是您要找的东西,您可以将其放入JDBC Request 采样器中,并在其中指定.s
可以从jar文件中运行ant脚本吗? 目前,我有一个build.xml,它调用一些java代码,这些代码在一个jar文件中。然后它做一些进一步的蚂蚁处理。 当我从Eclipse导出jar文件时,我可以选择添加构建。xml文件到jar,所以我想知道我是否可以直接从jar运行ant脚本,这样我只需要给人们jar文件,而不是ant脚本。
问题内容: 我有一个像这样的textfile.txt: 如何删除最舒适的前三行和最后一行? 问题答案:
问题内容: 我正在尝试从文本文件中删除一行文本,而不将其复制到临时文件中。我正在尝试通过使用Printwriter和Scanner并让它们同时遍历文件来实现此目的,writer写Scanner读取的内容并用相同的东西覆盖每一行,直到到达我希望的行为止删除。然后,我前进扫描仪而不是写程序,然后像以前一样继续。这是代码: 但首先要使用参数:我的文件名是数字,因此它将显示为1.txt或2.txt等,因此