2011-11-05 62 views
1

考虑这个封装结构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该程序应执行存储在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

所有的类都是这些东西可能吗?如果是的话,我该如何做到这一点。

我发现到现在的东西,

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

+0

你到目前为止试过了什么?什么给你反射的问题?是的,你想要做什么是可能的。这是功课吗? –

+0

@DaveNewton:'java.assignments.lab1.exe1.java'是作业,问题是我为了学习java而付出的额外努力。我不知道如何使用反射。因此,我正在寻找一个关于如何实现这个目标的一般想法 – Gautam

+0

我会首先尝试使用Google搜索“反思教程”,其中有相当多的材料可用:) –

回答

1

我不建议有你开始学习思考;我认为这是一个初学者太难了,甚至对于一些中级程序员,也得参与。我的意思是,即使你理解的概念等等,反思是一个很大的话题,带你而远离编程做具体的事情。

因此,我建议这个:

把所有的“转让”类实现一个决定,他们定义了一个方法,你再要执行的接口。例如,在一个名为MainClass.java类中定义

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

,然后让每个任务的实现该接口:

public class Lab2 implements MainClass 

即,只是把类声明后,“实现MainClass”。

如果你还不知道,你将需要处理传递给命令行java的主要方法,在“参数”字符串数组。这就是这里的“EXE”和用户要你执行类的名称会显示出来。

所以你的“主要主要”方法将测试第一个参数,看它是否等于“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

+1

好吧,我现在看到你的教程专门针对反思,所以也许你确实想要这样做。但至少要意识到这是一种选择。我认为你很“开箱”并希望延长你的任务;一旦你完成了训练,我会雇用你在我店里的一个入门职位,其他的事情是平等的(如果我有一家商店)。 – arcy

+0

对于问题1,这是一个非常简单而有趣的解决方案,谢谢。 – Gautam

1

您不能列出包含在所有类别根据Can you find all classes in a package using reflection?

如果要列出一个类的源代码,我建议您为您的罐子源并以某种方式显示它的方式包。

+0

这是我真正卡住的部分,即使如果我将源文件包含在jar文件中,我如何列出它并显示内容? – Gautam

+1

@GautamK您可以使用[JarInputStream](http://download.oracle.com/javase/6/docs/api/java/util/jar/JarInputStream.html)访问jar文件中的资源。或者如果它们在类路径上,则从它们加载任意资源。还要注意,你可以通过查询jar文件来查找包中的所有类。 –

+1

@GautamK或我会使用Class.getResourceAsSteam(“/ my/package/MyFile.java”),它返回给你一个InputStream对象。从这里可以看到很多将输入流写入标准输出的例子。 – Danny

相关问题