Основы Java ClassLoader - PullRequest
       12

Основы Java ClassLoader

2 голосов
/ 30 августа 2011

Мне нужен персональный инструмент командной строки, который должен взять имя конкретного подкласса в качестве аргумента 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).

Спасибо!

Ответы [ 3 ]

5 голосов
/ 30 августа 2011

Вам нужно будет убедиться, что фактический класс находится в пути к классам при запуске вашей программы

Class clazz = Class.forName("fully.qualyfied.ClassName");
Shape instance = (Shape)clazz.newInstance();
instance.draw()
3 голосов
/ 30 августа 2011

Для этого вам не нужно писать собственный загрузчик классов - просто укажите правильный путь к классам. Примерно так должно работать:

String className = 'Circle';
Class myClass = Class.forName(className);
Object ofMyClass = myClass.newInstance();
1 голос
/ 30 августа 2011

Это должно быть так же просто, как:

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