2015-05-26 3 views
1

Я использую код выше, чтобы создать новый объект из класса:Получить доступ к классу через новый экземпляр

Object obj = Class.forName("myClass").newInstance() 

Но по какой-то причине я не могу использовать УАК OBJ для выполнения методов или получить переменные из класса «MyClass», как это:

obj.methodFromMyClass(); 

смысл этого заключается в создании динамически объекта из класса «MyClass» через параметры другого класса.

Класс A

public A() { 

    B b = new B("myClass"); 

} 

Класс Б

public B (String className) { 

    Object obj = Class.forName(className).newInstance(); 
    obj.methodFromMyClass(); 

} 

класса MyCLASS

public void methodFromMyClass() { 

    // Some code 

} 

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

Каждый намек приветствуется.

+2

Дайте взглянуть на [Factory Pattern] (http://www.tutorialspoint.com/design_pattern/factory_pattern.htm) – araknoid

ответ

3

Вы должны castobj в myClass так, что компилятор знает, какой тип объекта является:

((myClass) obj).methodFromMyClass(); 

Если вы собираетесь использовать методы из myClass неоднократно на obj, вы хотели бы присвоить его новая переменная, которая явно декларирует класс:

myClass myObj = (myClass) myObj; 
myObj.aMethodFromMyClass(); 
myObj.anotherMethodFromMyClass(); 

Если вы не К.Н. введите тип obj во время компиляции, вам может потребоваться использовать reflection для звонка methodFromMyClass, например.

obj.getClass().getMethod("methodFromMyClass", new Object[0]).invoke(obj); 
+0

Спасибо вам за объяснение, но это не совсем то, что я ищу, я создаю его динамически, это может быть myClass, а также ClassAbc, classdbc и т. Д. –

+1

Хорошо, я обновлю свой ответ – Armand

+1

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

1

Вы должны бросить obj к типу вашего класса:

myClass obj = (myClass) Class.forName(className).newInstance(); 
obj.methodFromMyClass(); 

Поскольку ваш класс B конструктор вызывает метод methodFromMyClass, он должен знать, какой тип бросить obj к. Этот тип должен иметь метод methodFromMyClass. Это не должен быть точный тип созданного экземпляра. Любой интерфейс или суперкласс, которые класс созданного экземпляра реализует/расширяет, будет выполняться до тех пор, пока он содержит этот метод.

+0

Casting 'OBJ' с String 'Classname' не работает, но я Об этом. –

+1

@VladimirLisovets Нет, вы не можете использовать его, используя переменную String. Он должен быть жестко закодированным типом. Если вы не знаете, к какому типу приложу его во время компиляции, вы можете использовать отражение, чтобы найти и вызвать этот метод. – Eran

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