2011-12-16 2 views
1

У меня есть запрос о создании экземпляра нового объекта в Java из класса, переданный в качестве параметра в методе, например:Создание экземпляра класса, переданного в java?

void myMethod(Class aReceived){ 
    object = new aReceived  // object will be a superclass of aReceived 
} 

Я видел это сделано с помощью Objective-C в паре строк, но я что он работает в java.

Вы можете помочь?

Заранее спасибо;)

+0

Я использовал aReceived.newInstance(); и изначально я получил такую ​​ошибку: unreported exception java.lang.InstantiationException; должны быть пойманы или объявлены брошенными. Я решил, добавив «throws Exception» в конец объявления myMethod, которое, похоже, прояснилось. Однако теперь мне не удается вызвать метод: попробовали использовать myMethod (testClass); где testClass - это тот, который я также определил в коде. Есть идеи? Еще раз спасибо за вашу помощь;) – eJm

+0

Добавил еще один раздел к моему ответу ниже, чтобы решить проблему, которую вы описываете. –

ответ

5

Если вы хотите создать объект с помощью конструкторы без аргументов:

void myMethod(Class<?> aReceived) { 
    Object newObject = aReceived.newInstance(); 
    ... 
} 

Если вы хотите создать объект через два-Arg конструкторы (с строкой , Int):

void myMethod(Class<?> aReceived) { 
    Object newObject = aReceived.getConstructor(String.class, int.class) 
     .newInstance("aaa", 222); 
    ... 
} 

Наконец, вы можете использовать дженерик, чтобы правильно установить тип newObject переменных (в верхней части любого из указанных выше фрагментов):

void myMethod(Class<T> aReceived) { 
    T newObject = aReceived.getConstructor(String.class, int.class) 
     .newInstance("aaa", 222); 
    ... 
    // Sadly, due to erasure of generics you cannot do newObject.SomeMethodOfT() 
    // because T is effectively erased to Object. You can only invoke the 
    // methods of Object and/or use refelection to dynamically manipulate newObject 
} 

[Приложение]

Как называется этот метод?

Вариант 1 - когда вы знаете, в коде написания времени, какой класс вы хотите, чтобы перейти к методу:

myMethod(TestClass.class) 

Вариант 2 - когда имя класса, который будет реализованным известно только в во время выполнения, как строка:

String className = ....; // Name of class to be instantiated 
myMethod(Class.forName(className)); 
+0

Я использовал aReceived.newInstance(); и изначально я получил такую ​​ошибку: unreported exception java.lang.InstantiationException; должны быть пойманы или объявлены брошенными. – eJm

+0

Да, это то, что мне было нужно, мне также пришлось добавить несколько строк «try» и «catch» для обработки исключений, даже если они вообще ничего не делают, компилятор java, похоже, все равно хочет их увидеть. Первоначально я думал, что сделал ошибки ввода, но похоже, что его java-протокол каким-то образом ожидает их. – eJm

3

Class имеет метод на нем под названием newInstance для создания экземпляров этого класса. Вы также можете посмотреть все java.lang.reflect package.

3
object = aReceived.newInstance(); 

Это предполагает, что класс имеет конструктор без аргументов.

1

Если у вас есть только конструктор по умолчанию, вы можете сделать что-то вроде этого:

aReceived.newInstance(); 

Если вам нужно передать параметры, которые вы не можете использовать этот метод. Но вы можете справиться с этим при определении того, что является правильным конструктором с getConstructor(Class<?> parameterTypes ...)

например. если вы хотите передать строку как единственный параметр, вы можете сделать это следующим образом:

Constructor ctor = aReceived.getConstructor(String.class); 
object = ctor.newInstance("somestring"); 
Смежные вопросы