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

时间:2011-11-05 01:41:55

标签: 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. 中的方法
  3. 如果我给$ java java.assignments.Main src java.assignments.lab2.Exe2该程序应该打印源代码 of Exe2.java

    如果显示的源代码包含我的评论,我更愿意 写在程序中。

  4. 如果我给$ java java.assignments.Main list它应该列出所有的 包和java.assignments

    中包含的类

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

  5. 中包含的所有类

    这些事情可能吗?如果是,我该如何做到这一点。

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

    我发现我可以从this tutorial动态加载和execute classes #1#, 但我如何实现#2# displaying Source codelisting packages #3#

2 个答案:

答案 0 :(得分:1)

您无法根据Can you find all classes in a package using reflection?

列出包中包含的所有类

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

答案 1 :(得分:1)

我不建议您开始学习反思;我认为这对初学者来说太难了,甚至对于一些中级程序员来说也太难了。我的意思是,即使你理解了这些概念等等,反思也是一个很大的主题,让你在编程中做出相当远的事情。

所以我推荐这个:

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

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的类上使用它。

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

我想说这个部分先运行一些不同的类。如果您仍然对显示源代码感兴趣并想知道在哪里放置它等,那么我们可以在另一课中进入。我真的认为如果你得到这个,那就足以完成一次努力。

RC