Android, интерфейс, новый экземпляр - PullRequest
0 голосов
/ 18 августа 2011

У меня проблема с вызовом newInstance с использованием Reflection в Android.

Мой интерфейс:

public interface IGiver {
    public int getNr();
}

Мой класс для вызова Отражение:

public class NrGiver implements IGiver {
    int i = 10;
    @Override
    public int getNr() {
        return i;
    }
}

То, как я пытаюсь вызвать getNr:

String packageName = "de.package";
String className = "de.package.NrGiver";

String apkName = getPackageManager().getApplicationInfo(packageName, 0).sourceDir;
            PathClassLoader myClassLoader =
                new dalvik.system.PathClassLoader(
                            apkName,
                        ClassLoader.getSystemClassLoader());
Class c =  Class.forName(className);
IGiver giver = (IGiver) c.newInstance();

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

Пожалуйста, помогите мне.

Мое решение:

Эй, ребята, наконец, я получил курицу.

Я нашел другой способ. на этот раз я также использовал newInstance, но на этот раз он работал. Мое решение:

Class c =  Class.forName(className);
Method methode = c.getDeclaredMethod("getNr");
Object i = methode.invoke(c.newInstance(), new Object[]{});

И это то, что я хотел сделать. У меня есть NrGiver.class где-то на моем телефоне. И это реализует интерфейс IGiver. Таким образом, он может быть загружен в мое приложение динамически. Мне нужно Integer из класса NrGiver. Так что я могу сделать мой код универсальным. Я попытался привести объект к своему интерфейсу, но это не удалось.

Итак, я нашел другой способ вызвать метод класса.

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

Ответы [ 2 ]

0 голосов
/ 18 августа 2011

не уверен, почему используется загрузчик классов. если загружены и IGiver, и NrGiver:

Class k = NrGiver.class;
IGiver g = (IGiver)k.newInstance();
0 голосов
/ 18 августа 2011
String className = "de.package.NrGiver";//line 1
Class c =  Class.forName(className);//line 2
IGiver giver = (IGiver) c.newInstance();//line3

в строка 2 forName пытается найти класс, но String представляет интерфейс, поэтому classLoader не находит класс и выдает исключение. добавляя к этому, в строке 3 вы пытаетесь получить экземпляр интерфейса, который не существует в java world. у них нет конструкторов. .

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