Java Отражения - PullRequest
       3

Java Отражения

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

У меня есть абстрактный класс «A», а класс «B» и «C» расширяют A. Я хочу создать их экземпляры во время выполнения на основе некоторой переменной. Примерно так:

public abstract class A {
    public abstract int count(); 
}

public class B extends A {
    public int count () {
        //print 10;
    }
}

public class C extends A {
    public int count () {
        //print 20;
    }
}

Я бы использовал приведенный ниже код для вызова счетчика методов:

String token;
int i = 10;
if (i == 10)  //edit
    token = "B";
else 
    token = "C";

A a;
try {
     a = (A) (Class.forName("org.source."+token)).newInstance();
} catch (Exception e) {
     //print e
}

a.count();

Так как я новичок в java отражениях, вот мои 2 вопроса:

  1. Правильно ли то, что я делаю выше (изменить: в случае конструкторов по умолчанию)? (Я предполагаю, да)

  2. Выше работает, если вызывается конструктор по умолчанию (без параметров). Как бы я справился с ситуацией, когда у меня есть конструкторы, которые принимают аргументы. Я не очень уверен, как я мог бы использовать Constructor.newInstance () можно использовать в вышеуказанной ситуации.

Любая помощь приветствуется,

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Да, это будет работать.

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

Скажем, например, что вы хотите вызватьконструктор с аргументами int и String.Вот код, который сделает это:

Class<?> clazz = Class.forName("org.source."+ token );
Constructor<?> constructor = clazz.getConstructor(int.class, String.class);
Object object = constructor.newInstance(1, "hello");
1 голос
/ 09 февраля 2012

То, что вы делаете, правильно, только если вы хотите вызвать конструктор без аргументов, который действительно является единственным, что вы можете сделать с помощью метода "newInstance" в классе. См:

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#newInstance()

для вызова конструкторов с n-аргументами используйте класс Constructor:

http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang.Object...)

См. В руководстве по Reflection примеры использования вышеперечисленного:

http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

Для получения дополнительной информации.

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