java - 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 编译和运行。
解决方案
因为您在命令行上执行此操作,所以除非明确包含 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 只是此处的一个示例,可以使用任何级别,具体取决于您要测试的功能。
推荐阅读
- selenium - 在调用另一个函数期间,我在线程“main”java.lang.NullPointerException 中收到“timeoutException”
- delphi - Delphi 使用 ScaleBy 和 Margin 进行缩放
- amazon-web-services - [亚马逊](500310) 无效操作:溢出(长有效范围 -9223372036854775808 到 9223372036854775807)
- bash - awk 根据不同列中的匹配对列中的值求和
- validation - 表单验证无法使用 onclick 和 window.open
- python - 如何在python控制台中隐藏输入
- maven - 为什么 *.war 文件在部署时没有在云 webapps 中解压?
- python - 如何比较python中的两个子进程输出值?
- c# - MVC .NET - 将多个模型传递给剃刀视图
- angularjs - Angularjs 和 moment.js - angularjs 没有显示正确的日期