Java : Executing a method of an arbitrary class in a sub package

标签 java reflection classloader dynamic-class-loaders

考虑这个包结构

java.assignments
    Main.java
    java.assignments.lab1
        Exe1.java
    java.assignments.lab2
        Exe1.java
        Exe2.java
        Exe3.java
    java.assignments.lab3
        Exe1.java
        Exe2.java
        Exe3.java
        Exe4.java
and so on.
  1. 我想以这样的方式编写主类,如果我给出 命令如
    $ java java.assignments.Main exe java.assignments.lab2.Exe2 程序应该执行main 方法存储在lab2.Exe2.java

  2. 如果我给出 $ java java.assignments.Main src java.assignments.lab2.Exe2 程序应该打印源代码 Exe2.java的

    我希望显示的源代码包含我认为的注释 写在程序中。

  3. 如果我给出 $ java java.assignments.Main list 它应该列出所有 java.assignments

    中包含的包和类

    如果我给出$ java java.assignments.Main list java.assignements.lab3 它应该列出 java.assignments.lab3

  4. 中包含的所有类

这些事情可能吗?如果是,我该如何实现这一目标。

到目前为止我发现的东西,

我发现我可以动态加载并执行this tutorial中的类#1# , 但如何实现#2#显示源代码列出包#3#

最佳答案

我不建议你开始学习反射(reflection);我认为这对于初学者来说太难了,甚至对于一些中级程序员来说也太难了,而且也太投入了。我的意思是,即使您确实理解概念等,反射也是一个大主题,它会让您远离编程中的具体事情。

所以我推荐这个:

让所有“赋值”类实现一个接口(interface),该接口(interface)指示它们定义一个您将要执行的方法。例如,定义

public interface MainClass
{
  public void main(String[] args);
}

在一个名为 MainClass.java 的类中,然后让每个作业都实现该接口(interface):

public class Lab2 implements MainClass

即,只需在类声明之后添加“implements MainClass”即可。

如果您还不知道,您将需要处理从命令行传递给 java main 方法的“arguments”字符串数组。这就是“exe”和用户希望您执行的类的名称将显示的位置。

所以你的“main main”方法将测试第一个参数,看看它是否等于“exe”。如果是,则 1. 将包名称 (java.assignments) 添加到您的类名中,使用 Class.forName() 实例化该类,将其转换为 Main,然后执行 main 方法。该代码将类似于:

if (args[1].equalsIgnoreCase("exe"))   // it might be args[0], I can't remember
{
  String className = "java.assignments." + args[2];
  Object o = Class.forName(className);
  Main   mainMethodClass = (Main)o;
  o.main();
}

Class.forName() 实例化给定类名的对象。您所需要的只是一个完全限定名称的字符串。

上面 Class.forName() 之后的行将新实例化的对象“转换”到 Main 接口(interface)。如果您的对象没有实现(或扩展)Main,您的代码将在执行强制转换的行上失败。它告诉编译器允许您使用它执行实现 Main 的类允许的操作。

之后,该对象就像您对其进行了“new”的对象一样,您可以调用其上定义的任何方法。

我想说的是,首先为一些不同的类运行该部分。如果您仍然对显示源代码感兴趣并想知道将其放在哪里等,那么我们可以在另一节课中讨论这一点。我真的认为如果你能运行这个,就足以完成一次努力。

rc

关于Java : Executing a method of an arbitrary class in a sub package,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8017568/

相关文章:

java - 在单元测试中使用反射来测试注释的存在是否被认为是好的做法?

java - 使用 Java 反射在集换式卡牌游戏中实现卡牌和效果

c++ - C/C++ : How to find out the own library name

liferay - 在 liferay 中跨 portlet 发送自定义对象

java - 如何将我的 ClassLoader 设置为 JVM 的 ClassLoader 来加载所有类(包括 jar 类)?

java - c :forEach loop printing square bracket delimiters

java - 在没有 IllegalMonitorStateException 的情况下解锁 ReentrantLock

java - 变量是如何被覆盖的

java - 了解 Java 中的类加载器

java - JPA2.0 支持自定义用户类型和二级缓存