1

考虑这个包结构

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,程序应该执行存储在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

这些事情可能吗?如果是的话,我该如何实现这一点。

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

我发现我可以execute classes #1#本教程中动态加载和,但是我如何实现#2# displaying Source codelisting packages #3#

4

2 回答 2

1

您不能根据Can you find all classes in a package using reflection?列出一个包中包含的所有类?

如果你想列出一个类的源代码,我建议在你的 jar 中包含源代码并以某种方式显示它。

于 2011-11-05T02:13:56.227 回答
1

我不建议你开始学习反思;我觉得对于初学者来说太难了,甚至对于一些中级程序员来说,也太投入了。我的意思是,即使你确实理解了这些概念等等,反射也是一个很大的话题,并且会让你远离在编程中做具体的事情。

所以我推荐这个:

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

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

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

public class Lab2 implements MainClass

即,只需在类声明之后放置“implements MainClass”。

如果您还不知道,您将需要处理从命令行传递给 java main 方法的“参数”字符串数组。这就是“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,那么您的代码将在执行强制转换的行上失败。它告诉编译器允许您使用它执行在实现 Main 的类上允许的操作。

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

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

rc

于 2011-11-05T04:08:21.280 回答