【问题标题】:Call a Static Method Using a String of the Class's filename in Java在 Java 中使用类文件名的字符串调用静态方法
【发布时间】:2013-02-27 13:59:32
【问题描述】:

假设我使用 file.list() 来获取 src 文件夹中的所有文件。假装一个文件名为Problem0001.java。是否可以仅使用字符串“Problem0001.java”调用Problem0001.java 类的方法?

更深层次的解释: 我正在研究 Euler 项目中的问题。欧拉计划是一堆需要数学和编程知识的问题。我希望每个问题都解决它自己的类。我决定如果我可以创建一个菜单,我可以在其中输入问题编号并且答案会显示在屏幕上,那就太棒了。我从一个 switch 语句开始,它会调用有问题解决方案的类。我想最终我会厌倦每次解决一个新问题时添加 switch 语句。我希望计算机找到所有解决方案类文件并将解决方案的编号放在一个列表中(因为我可能会跳过一些问题)。每当我进入菜单屏幕时,列表就会被打印出来。我输入我想查看的解决方案的编号,这就是我迷路的部分。我不知何故需要拿那个号码并用相同的号码调用类的静态方法。因此,如果我输入 3,classfile Problem0003.java 将激活,或者编译器可以正常工作。

【问题讨论】:

    标签: java string methods filenames


    【解决方案1】:

    当你有一个类名时,你必须在运行时使用ClassLoader 来加载这个类以获取.class

    Class<?> clazz = Class.forName("org.someorg.SomeClass");
    

    一旦你有了它,你就可以使用Reflection调用静态方法

    Method method = clazz.getMethod("methodName", String.class);
    method.invoke(null,"someString");
    

    注意:假设该方法将字符串作为参数是String.class

    【讨论】:

    • 请怜悯我。什么是“org.someorg.SomeClass”。这与网站上的内容有关吗?我只是在本地工作。我会用我的目录替换它吗?
    • 这是一个命名包的标准:docs.oracle.com/javase/tutorial/java/package/namingpkgs.html这会帮助你。
    • 非常感谢。我花了一天时间阅读如何让它发挥作用。最后。顺便说一句,我尝试调用(null,null),但似乎您需要在 Invoke(object,null)中放入一个对象;或者我不知道我在说什么,但它似乎只有在我这样做时才有效。
    • method.invoke(..) 忽略您作为参数“要调用该方法的对象”传入的类的实例,因为该方法是静态的,它不需要该类的实例调用它的方法。
    【解决方案2】:

    是的,你可以,使用 java Reflection API

    看一下example,了解如何在运行时调用方法。

    【讨论】:

    • 有趣。我在课堂上没有教过这个。我会立即阅读并尝试一下!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多