Java:当方法明显存在时,带有反射的NoSuchMethodException

时间:2016-09-26 12:33:26

标签: java reflection

我一直在尝试使用Java中的Reflection,这是我的代码:

String charsetName = "UTF-16LE";
java.nio.charset.CharsetDecoder cd = Charset.forName(charsetName).newDecoder();

Class c = cd.getClass();

Class[] paramTypes = new Class[] {ByteBuffer.class, CharBuffer.class };

try {
     Method method = c.getDeclaredMethod("decodeLoop", paramTypes);
     method.setAccessible(true);
     assertTrue(true);
} catch (NoSuchMethodException | SecurityException e) {
     e.printStackTrace();
     assertTrue(false);
}

方法显然存在。 Java源代码:

package java.nio.charset;

public abstract class CharsetDecoder {
...
   protected abstract CoderResult decodeLoop(ByteBuffer in,
                                          CharBuffer out);
...
}

输出:

java.lang.NoSuchMethodException:   sun.nio.cs.UTF_16LE$Decoder.decodeLoop(java.nio.ByteBuffer, java.nio.CharBuffer)
at java.lang.Class.getDeclaredMethod(Class.java:2130)
at com.krasutski.AppTest.testDeclaredMethod(AppTest.java:227)
...

如果我使用参数 charsetName 作为

  • “UTF-16LE” - 例外 NoSuchMethodException
  • “UTF-16BE” - 异常 NoSuchMethodException
  • “UTF-8” - 非常好
  • “cp1252” - 非常好

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您在[{1}}的实际类型上调用了getDeclaredMethod,而在{{1}中 }}。鉴于它是一个抽象类,这不是cd的实际类型。

只需改变一下:

CharsetDecoder

cd

此时例外消失了。如果它适用于UTF-8和cp1252,则表明用于该的类也声明Class c = cd.getClass(); ,而Class c = CharsetDecoder.class; 和{{1}他们可能会继承。