Java类加载器基础

Java类加载器基础,java,abstract-class,classloader,Java,Abstract Class,Classloader,我需要一个个人命令行工具,该工具应将具体子类的名称作为CL参数,并在运行时实例化正确的Java类: public class MyCommandLineTool { public static void main(String[] args) { // Read the name of the desired class to load String strClassName = getClassNameFromArgs(args);

我需要一个个人命令行工具,该工具应将具体子类的名称作为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
或者类似的东西(现在不担心命令行调用的语法)

我已经阅读了几篇关于类加载器的入门教程,但是当需要编写自己的类加载器时,我对理解感到窒息。所有教程似乎都专注于如何编写类加载器,但没有解释何时适合这样做。而且,因为这样做似乎相当复杂,如果不需要的话,我宁愿不用自己写

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

有谁能澄清我是否需要为这个特定的示例编写自己的加载程序,为什么,如果没有,我需要实现什么来代替
someMagicalClassLoaderCall(String)


谢谢

运行程序时,必须确保实际类位于类路径上

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

您不需要为此编写自己的类加载器,只需正确指定类路径即可。像这样的方法应该会奏效:

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

它应该简单到:

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