Java:执行子包中任意类的方法



考虑这个包结构

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程序应该执行mainlab2.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. 中包含的所有类

这些事情可能吗?如果是,我该怎么做呢?

到现在为止我所发现的东西,

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

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

所以我推荐这样:

让你所有的"赋值"类实现一个接口,指示它们定义一个方法,然后你要执行。例如,定义

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

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

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接口。如果您的对象没有实现(或扩展)Main,那么您的代码将在执行强制转换的那一行失败。它告诉编译器允许你对它做一些在实现Main的类上允许做的事情。

之后,对象就像你在上面做了"new"操作的对象一样,你可以调用在它上面定义的任何方法。

我会说让那部分先运行一些不同的类。如果你仍然对显示源代码感兴趣,想知道把它放在哪里,等等,那么我们可以在另一课中讨论这个。我真的认为,如果你让它运行起来,这将是足够的一次努力完成。

rc

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

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

相关内容

  • 没有找到相关文章

最新更新