2011-08-30 87 views
2

我需要一个个人的命令行工具,应采取具体子类的CL参数的名称,并在运行时实例化一个正确的Java类:的Java类加载器基础

public class MyCommandLineTool 
{ 
    public static void main(String[] args) 
    { 
     // Read the name of the desired class to load 
     String strClassName = getClassNameFromArgs(args); 

     // Now create an instance of that class (if it exists/is valid/etc.) 
     Shape oShape = someMagicalClassLoaderCall(strClassName); 

     // Now call the subclass's overridden draw() method 
     oShape.draw(); 
    } 
} 

public abstract class Shape 
{ 
    // Some stuff 

    public abstract void draw(); 
} 

public class Circle extends Shape 
{ 
    @Override 
    public void draw() 
    { 
     // etc... 
    } 
} 

因此,从命令行,你可以按照以下方式运行程序:

java MyCommandLineTool -shape Circle 

或(现在不担心命令行调用的语法)类似的东西。

我已经阅读了ClassLoaders的几个入门教程,但是在理解需要编写自己的类加载器。所有的教程似乎都集中在如何来编写你的类加载器,但没有解释什么时候这样做是合适的。而且,因为这样做似乎相当复杂,如果我不必这样做,我宁愿不必写自己的。

在我看来,如果我有一个编译Circle.class文件,任何JVM应该没有问题读取类文件,并基于字符串我通过包含类的名字它在运行时构建Circle的一个实例。

任何人都可以澄清我是否需要写我自己的加载器为这个具体的例子,为什么,如果不是,我需要实现什么,以代替someMagicalClassLoaderCall(String)

谢谢!

回答

5

你必须确保实际的类是在类路径中,当你运行你的程序

Class clazz = Class.forName("fully.qualyfied.ClassName"); 
Shape instance = (Shape)clazz.newInstance(); 
instance.draw() 
3

你不应该需要编写自己的类加载器是 - 只要正确地指定类路径。像这样的东西应该工作:

String className = 'Circle'; 
Class myClass = Class.forName(className); 
Object ofMyClass = myClass.newInstance(); 
1

它应该是那么容易,因为:

Class c = Class.forName(strClassName); 
Object o = c.newInstance();