2012-01-13 2 views
-1

У меня есть следующий интерфейсСоздание объекта интерфейса с помощью строки

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». Как я могу загрузить класс и создать объект из Реализации?

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

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

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

ответ

1
Class<?> clazz = .... 
Object o = clazz.newInstance(); 
// o will be a valid instance of you impl class 

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

2

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

TestImpl ti = (TestImpl) Class.forName("test.test.impl.TestImpl").newInstance(); 
+0

добавить бросание :) – helios

4

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

+0

Что ты имеешь в виду под "всегда без аргументов"? Вы можете создать экземпляр нового экземпляра с параметрами args/parameters, такими как: Object obj = klass.getConstructor (parameterTypes) .newInstance (parameterArr); – bchetty

+0

EDIT: Извините, я неправильно прочитал ваш комментарий. :) – bchetty

+0

Правда, я мог бы написать его чище. Class.newInstance - это не-arg, но Constructor.newInstance параметризуем. – zeller

Смежные вопросы