Java загрузки классов из строки - PullRequest
1 голос
/ 19 февраля 2012

У меня есть определенные классы, которые мне нужно загрузить.Там имена хранятся в массиве String.Я могу загрузить определенные классы, но я не могу манипулировать правильно.

String [] myClassesList = {"Class1", "Class2", "Class3"...};
FileClassLoader loader = new FileClassLoader("MyClassesPath");

Class [] c = new java.lang.Class[myClassesList.length];

for(int i=0; i<myClassesList.length; i++){
     c[i]=loader.loadClass (myClassesList[i]);
     ... //This work proprely
}

, но я не могу

  c[i] myNewCi = new c[i].<constructor>();

Примечание: все мои классы расширены JPanel.Мне нужно добавить в jTabbedPane.Я пытаюсь сделать следующий код.

...
     myPanelClass myPanel = new myPanelClass();
     jTabbedPane1.addTab("myPanelName", myPanel);
... //This work proprely

Любой отзыв поможет.Спасибо!

Ответы [ 4 ]

2 голосов
/ 19 февраля 2012

Если все, что вам нужно, это расширить класс JPanel, чтобы вы могли добавить его во вкладку, попробуйте следующее.

Class<? extends JPanel> c =  Class.forName(myClassesList[i]).asSubclass(JPanel.class);
JPanel panel = c.newInstance();
jTabbedPane1.addTab(panel);

Это создаст новый класс (с помощью Reflection), который расширяет JPanel, но вы будете ограничены в его функциональности, если вы не приведете его к типу.

Если вы решите, что вам нужно больше взаимодействовать с вашими классами (вызывать другие методы и т. д.) и не хотите вводить тип, вам придется определитьконтракт на занятия.Это будет означать добавление абстрактного класса между вашими классами и иметь абстрактный класс, расширяющий JPanel.Вот пример.

Определите класс Abstract.это будет иметь любые дополнительные имена методов, которые вы хотите в своих классах

public abstract class ATest extends JPanel{
    public abstract String doSomething();
}

Тогда вам нужно реализовать ваши конкретные классы

public class Class1 extends ATest{
    public Class1(){
        //init me
    }

    @Override
    public String doSomething() {
        return "Class 2";
    }
}

Теперь вы сможете свободно инициализировать класс и делать то, чтопожалуйста, используя отражение

Class<? extends ATest> c =  Class.forName(myClassesList[i]).asSubclass(ATest.class);
ATest panel = c.newInstance();

System.out.println(panel.doSomething());
jTabbedPane1.addTab(panel);
1 голос
/ 19 февраля 2012

Возможно, вы захотите сделать что-то вроде:

c[i].getConstructor(....).newInstance(....);

Где .... содержит параметры соответствующего конструктора.

0 голосов
/ 19 февраля 2012

Вы не можете вызвать new для класса объекта , только для самого класса по имени, как это показано в коде, который его определяет.Если у вас нет доступа к классу таким образом, вы должны использовать отражение.

Для справки:

class MyClass ...

можно создать с помощью new, но:1010 *

MyClass.class

- это объект, представляющий этот класс, и его нельзя создать с помощью new.В вашем случае, это:

MyClass.class.newInstance();

должно быть достаточно.

0 голосов
/ 19 февраля 2012

Вы хотите использовать Отражение Java .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...