java - 反射方法时抛出 TypeNotPresentException

标签 java android reflection

我有一个子类,它有一个在 Android 项目中抛出异常的方法。

public class Bar extends Foo {
    public void method(String someClass) throws ReflectiveOperationException {
        Class.forName(someClass);
    }
}

我有一个基类,它的方法反射(reflect)了它自己的方法,当然可以从子类中调用这些方法。

public class Foo {
    public void reflectOnMethods() {
        for (Method m : this.getClass().getDeclaredMethods()) {
           //do stuff with methods
        }
    }
}

当 Bar 调用其继承的 reflectOnMethods 时,我会看到这样的堆栈跟踪

02-05 21:58:04.461: E/AndroidRuntime(2737): java.lang.TypeNotPresentException: Type java/lang/ReflectiveOperationException not present
02-05 21:58:04.461: E/AndroidRuntime(2737):     at java.lang.Class.getDeclaredMethods(Native Method)
02-05 21:58:04.461: E/AndroidRuntime(2737):     at java.lang.Class.getDeclaredMethods(Class.java:703)

当我将抛出的异常从 ReflectiveOperationException 更改后,问题就消失了至 ClassNotFoundException但是 为什么会这样??!!?

我对此感到困惑,并会查看 JDK 源代码以尝试找出答案,但我觉得很懒。

最佳答案

问题是您正尝试在 API <19 上运行代码,但 ReflectiveOperationExceptionClassNotFoundExceptionIllegalAccessException 的基类、InstantiationExceptionInvocationTargetExceptionNoSuchFieldExceptionNoSuchMethodException 自 API 19 以来。

如果您希望与低于 19 的 API 级别兼容,请不要在 throws 子句中使用 ReflectiveOperationException

public class Bar extends Foo {
    public void method(String someClass) throws ClassNotFoundException {
        Class.forName(someClass);
    }
}

关于java - 反射方法时抛出 TypeNotPresentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355206/

相关文章:

c# - 无法在 .NET Core 中创建动态类型

java - 用大括号澄清一种方法内的单独代码部分

java - 如何使用 Scanner 读取文本文件并生成按字母顺序排列的词汇列表

java - 来自 Java 的 Linux 命令

java - Spring 在运行时针对特定时间安排任务

android + ZXing条码扫描库——自定义大小和方向

android - Honeycomb 的新小部件的文档在哪里?

java - 更新查询游标 - 无法从 CursorWindow 读取第 0 行、第 -1 列

java - Java 的反射库 : find all classes in a package

java - 如何使用反射循环子类中的字段