当前位置: 首页 > 知识库问答 >
问题:

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

孟杰
2023-03-14

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

例如,如果我有这个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)

我知道该程序没有找到任何方法,但我不知道如何修复它。

提前感谢!

共有2个答案

唐高卓
2023-03-14

当使用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);
    }
}

总之:

  1. 类Test没有名为t.getP()的方法。getName()
  2. 括号不是方法名称的一部分
须巴英
2023-03-14

在评论中,您详细说明了您的目标是做一些事情以确定您是否要附加. 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等,因此