在Java中从文本文件运行函数



我想实现一个程序,它读取一个文本文件并执行其中的每一行。

例如,如果我有这样的文本文件:

Commands.txt h5> 下面的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在评论中提到的,你需要在commands.txt中分解你的行,这样每行都包含正确的"命令";您需要调用。例如:

Method m = Class.forName("Person").getMethod("getName");

解析器应该以类似的方式检索这些参数。如果你注意到你得到的错误,你会注意到在最后有两组括号。这是因为API假定方法名本身包含字符()

:我不知道谁否决了这个答案,所以让我更清楚一点。你需要分解你的命令。您还需要从Test类中获取对象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);

每个String参数可以在单独的行中,也可以在由某个字符分隔的同一行中。例如

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);
}
}

在简介:

  1. Test没有名为t.getP().getName()的方法。
  2. 括号不是方法名的一部分。

更新# 2我写了下面的代码来演示如何使用反射来做我上面提到的事情,并从方法中获取返回类型:

public class Person {
private final String name;
private final int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {return name;}
public int getAge() {return age;}

public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Person p = new Person("Hector", 54);
Method getName = p.getClass().getMethod("getName");
Method getAge = p.getClass().getMethod("getAge");
System.out.println(getName.invoke(p));
System.out.println(getAge.invoke(p));

System.out.println("getName() returns " + getName.getReturnType().getName());
System.out.println("getAge() returns " + getAge.getReturnType().getName());
}
}

以上代码输出:

Hector
54
getName() returns java.lang.String
getAge() returns int

在评论中,您详细说明了您的目标是为了确定是否要附加.toString()而做的事情。

我有一个文本文件,它有很多行,来自另一个程序,它是一个XML到Java的转换器,但它并不完美。我想检查所有在最后调用的方法是否返回一个String。我一直在手工做这个。最后的目标是,如果方法没有返回String,我们就在最后附加一个. tostring()。

对于这个问题陈述,这里有一个完全不同的方法:

  • 检查没有
  • 跳过所有的反射动态代码评估从文本文件的东西
  • 只需将.toString()附加到
  • 的所有位置

根据您在注释中提到的内容,有些行将需要追加.toString(),即它是一种"XML到Java的转换器,但它不是完美的">。有些行不需要,但是附加一个.toString()是可以的。例如,这是完全有效的Java:

{
t.getP().getName()
t.getP().getAge()
t.getP().getLocation()
}
0

相关内容

最新更新