我需要一个个人命令行工具,它应该将具体子类的名称作为CL参数,并在运行时实例化正确的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)
。
谢谢!
发布于 2011-08-30 14:50:49
在运行程序时,必须确保实际的类在类路径上
Class clazz = Class.forName("fully.qualyfied.ClassName");
Shape instance = (Shape)clazz.newInstance();
instance.draw()
发布于 2011-08-30 14:51:04
您不需要为此编写自己的类加载器--只要正确地指定类路径即可。像这样的事情应该有效:
String className = 'Circle';
Class myClass = Class.forName(className);
Object ofMyClass = myClass.newInstance();
发布于 2011-08-30 14:52:26
这应该像以下几点一样容易:
Class c = Class.forName(strClassName);
Object o = c.newInstance();
https://stackoverflow.com/questions/7245058
复制相似问题