Java反射-未找到Android类

Java反射-未找到Android类,java,android,reflection,Java,Android,Reflection,我试图运行反射来检查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.le

我试图运行反射来检查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");
    }
}
String[]packages=新字符串[]{“java.lang.”,
“android.widget。”,
“android.util。”,
“android.app。”,
“android.view。”,
“android.content.”;
对于(int i=0;i
但是,我得到了输出: 类android.widget.Toast不存在(但我知道它存在,这就是类所在的位置) 有什么想法吗



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

当我执行代码时,我得到以下输出:

class java.lang.Toast doesnt exists
class Exists
因为您迭代所有包,所以无论您的类是否存在,您都会得到每个包的输出,并且只有在找到匹配项时才会停止

我认为您试图实现的是始终只获得一个输出:要么类存在,要么不存在。您可以通过创建一个方法
classExists()
,然后使用java流API来查找您的包中是否有包含您的类
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;
    }
}
public void myMethod(){
List packages=Arrays.asList(
“java.lang.”,
“android.widget。”,
“android.util。”,
“android.app。”,
“android.view。”,
“安卓。内容。”
);
字符串className=“Toast”;
if(packages.stream().anyMatch(pkg->classExists(pkg+className))){
System.out.println(“类存在”);
}否则{
System.out.println(“类不存在”);
}
}
布尔类存在(字符串fullClassName){
试一试{
Class.forName(fullClassName);
返回true;
}catch(classnotfounde异常){
返回false;
}
}

因为您是在命令行上执行此操作,所以没有理由让运行时可以使用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 level 21只是一个示例,根据您要测试的功能,可以使用任何API级别。

如果您将要查找的类更改为在控制台中执行Java程序时肯定加载的类,例如Java.lang.String,我想你会发现程序成功返回。JRE没有给你安卓软件包。是的,我知道,这就是为什么我想知道是否有办法访问安卓类。问题没有解释这一点。当你编辑这个问题时,希望我下面的答案有帮助。当我运行我的代码时,我发现Toast并不存在于所有的包中。所以我试着运行你的代码,但仍然得到相同的输出-类不存在。是否从命令行\终端运行它?你在你的系统变量中提到了什么特别的东西吗?嗯,这很奇怪。。。我在Android Studio的一个空的新项目中运行了它。我没有做任何特别的事情,只是创建了一个新的Android项目,就这样。也许就是这样。我并不是试图从Android工作室运行它,而是尝试使用常规Java代码运行它。(因为我在没有android Studio的情况下使用这段代码)像Toast这样的类是android运行库的一部分,标准java应用程序无法使用。有没有办法下载并添加一些它将被支持的配置?