Java ClassLoader基础知识

IAm*_*aja 2 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);

        // 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...
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,从命令行,您可以按如下方式运行该程序:

java MyCommandLineTool -shape Circle
Run Code Online (Sandbox Code Playgroud)

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

我已经阅读了几篇关于ClassLoaders的入门教程,但是需要编写自己的类加载器,我很难理解.所有教程似乎都专注于如何编写类加载器,但没有解释何时适合这样做.并且,因为这样做似乎相当复杂,如果我不必这样做,我宁愿不必写自己的.

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

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

谢谢!

bpg*_*rgo 5

运行程序时,您必须确保实际的类在类路径上

Class clazz = Class.forName("fully.qualyfied.ClassName");
Shape instance = (Shape)clazz.newInstance();
instance.draw()
Run Code Online (Sandbox Code Playgroud)