反射API在迁移到Java 9时不会抛出此类方法异常

时间:2018-12-20 10:03:30

标签: java reflection java-9

我正在从Java 8迁移到Java 9 我正在使用反射从类'java.lang.Throwable'中获取方法'getStackTraceElement(int)'。 而且我将可访问性设置为“ true”。

程序适用于Java 8 但是当我迁移到java 9时, 它开始失败并出现错误     'java.lang.NoSuchMethodException:java.lang.Throwable.getStackTraceElement(int)。

我有如下代码在Java 8中可以正常工作 私有静态方法m;

'public static void main(String args[])
{
    try 
    {
        System.out.println("here1");
        //next line throws error
        m = Throwable.class.getDeclaredMethod("getStackTraceElement",int.class);
        m.setAccessible(true);
        System.out.println("here2");
    } catch (Exception e) {

        //logger.warn(e.getLocalizedMessage(), e);
        System.out.println("==>"+e.getLocalizedMessage);
        System.out.println("==>"+e.getName);
        System.out.println("==>"+e.getStackTraceElement);
        System.out.println("here3");
    }
}'

2 个答案:

答案 0 :(得分:6)

他们为此专门在Java 9中引入了一个名为StackWalker的类。

https://docs.oracle.com/javase/9/docs/api/java/lang/StackWalker.html

答案 1 :(得分:1)

如果查看Throwable类java doc https://docs.oracle.com/javase/9/docs/api/java/lang/Throwable.html,您会发现getStackTraceElement已从类中删除,这就是您收到此错误的原因。

如Demozo所述,请使用https://docs.oracle.com/javase/9/docs/api/java/lang/StackWalker.html