Создать объект интерфейса по строке - PullRequest
0 голосов
/ 13 января 2012

У меня есть следующий интерфейс

package test.test;

public interface IMyInterface {
 public String hello();
}

и реализация

package test.test.impl;

public class TestImpl implements IMyInterface {
 public String hello() { return "Hello"; }
}

Так что у меня есть только полная строка "test.test.impl.TestImpl".Как я могу загрузить класс и создать объект из реализации?

Я буду использовать текущий загрузчик классов, но понятия не имею, как создать объект.

Class<?> i =  getClass().getClassLoader().loadClass("test.test.impl.TestImpl");
IMyInterface impl = null;

Спасибо за помощь!

Ответы [ 5 ]

4 голосов
/ 13 января 2012

С Class.newInstance .Недостаток этого подхода заключается в том, что он подавляет проверенные исключения (и вводит новые исключения, связанные с отражением) и всегда без аргументов.В качестве альтернативы вы можете использовать Class.getConstructor (затем Constructor.newInstance), таким образом вы можете предоставить аргументы, но проблема исключений все еще существует.

2 голосов
/ 13 января 2012

Использовать отражение:

TestImpl ti  = (TestImpl) Class.forName("test.test.impl.TestImpl").newInstance();
2 голосов
/ 13 января 2012

Использование impl = (IMyInterface) i.getConstructor().newInstance();

1 голос
/ 13 января 2012
Class<?> clazz = ....
Object o = clazz.newInstance();
// o will be a valid instance of you impl class

Он вызовет конструктор по умолчанию (у вас должен быть один!).

0 голосов
/ 13 января 2012
IMyInterface impl = null;
Class testImpl = Class.forName("test.test.impl.TestImpl");
if(testImpl != null && IMyInterface.class.isAssignableFrom(testImpl.getClass()) {
    impl = testImpl.getConstructor().newInstance();
}

Также проверьте: 1) Использование Java Reflection - java.sun.com 2) Java экземпляр класса из строки - Stackoverflow

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