首页 > 解决方案 > Java 反射 - 未找到 Android 类

问题描述

我正在尝试运行反射以检查 Java 中是否存在某些 android 类(例如 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");
    }
}

但是,我得到了输出:类 android.widget.Toast 不存在(但我知道这是类所在的位置)有什么想法吗?


编辑:我正在尝试编写一个 Java 类,它不是从 Android Studios 运行,而是使用 cmd 行中的 javac 编译和运行。

标签: javaandroidreflection

解决方案


因为您在命令行上执行此操作,所以除非明确包含 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 类。默认情况下,您只会获取 JDK 安装中包含的 java 系统库。

但是,如果您在运行时提供适当的路径,那么突然间所有的魔法都会发生:

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

请注意,Android API 级别 21 只是此处的一个示例,可以使用任何级别,具体取决于您要测试的功能。


推荐阅读