Отражение Java - классы Android не найдены - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь запустить рефлексию, чтобы проверить, существует ли какой-нибудь класс Android в Java (например, Toast).Я запускаю его из командной строки, используя этот код:

String [] packages = new String[] {"java.lang.",
    "android.widget.",
    "android.util.",
    "android.app.",
    "android.view.",
    "android.content."};
for (int i = 0; i < packages.length; i++){
    String package_name = packages[i];
    try {
        Class<?> clazz = Class.forName(package_name + "Toast");
        System.out.println("class Exists");
        return clazz;
    }
    catch (ClassNotFoundException e){
        System.out.println("class " + package_name + "Toast doesnt exists");
    }
}

Тем не менее, я получаю вывод: class android.widget.Toast не существует (но я знаю, что это так, где классв) какие-нибудь идеи?


РЕДАКТИРОВАТЬ: я пытаюсь написать класс Java, который не работает на Android Studios, но компилируется и выполняется с использованием javac из строки cmd.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Поскольку вы выполняете это в командной строке, нет причин, по которым пакеты / классы Android должны быть доступны для среды выполнения, если они явно не включены.Вывод вашей программы имеет смысл - если вы не предоставите в программу правильные библиотеки Android, совпадения не будет, когда вы попытаетесь разрешить определенный класс Android, такой как Toast.

Ответ, по сути, заключается в эффективном использовании пути к классам Java.По умолчанию, без указания аргумента, это рабочий каталог «.».

Добавьте к нему, используя -classpath в качестве аргумента.Наивно компилировать:

javac YourReflectionTest.java

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

Если вы сделаете это, javac также преуспеет

javac -classpath ".;/opt/android-sdk/platforms/android-21/android.jar" YourReflectionTest.java

Если вы запустите программу,и попробуйте

java YourReflectionTest

Это все равно даст тот же результат.Зачем?Во время выполнения все еще не загружены классы Android.По умолчанию вы получите только системные библиотеки java, включенные в вашу установку JDK.

Но, если вы укажете подходящий путь во время выполнения, вдруг произойдет вся магия:

java -classpath ".;/opt/android-sdk/platforms/android-21/android.jar" YourReflectionTest

Обратите внимание, что API-интерфейс Android уровня 21 - это только пример, который можно использовать в зависимости от того, какие функции вы пытаетесь протестировать.

0 голосов
/ 14 декабря 2018

Когда я выполняю ваш код, я получаю следующий вывод:

class java.lang.Toast doesnt exists
class Exists

Поскольку вы перебираете все пакеты, вы получаете выходные данные для каждого пакета, независимо от того, существует ваш класс или нет, и выОстановитесь только тогда, когда найдете совпадение.

Я думаю, что вы пытаетесь добиться, чтобы всегда получать только 1 результат: либо класс существует, либо нет.Вы можете сделать это, создав метод classExists(), а затем с помощью API потока java найти, содержит ли ваш пакет ваш класс Toast:

public void myMethod() {
    List<String> packages = Arrays.asList(
            "java.lang.",
            "android.widget.",
            "android.util.",
            "android.app.",
            "android.view.",
            "android.content."
    );
    String className = "Toast";
    if (packages.stream().anyMatch(pkg -> classExists(pkg + className))) {
        System.out.println("class exists");
    } else {
        System.out.println("class doesnt exist");
    }
}

boolean classExists(String fullClassName) {
    try {
        Class.forName(fullClassName);
        return true;
    } catch (ClassNotFoundException e) {
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...