Java: NoSuchMethodException与反射当方法明显存在



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

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" - ExceptionNoSuchMethodException
  • "UTF-16BE" - ExceptionNoSuchMethodException
  • "UTF-8" -非常好
  • "cp1252" -非常好

我该怎么解决这个问题?

您在cd实际类型上调用getDeclaredMethod,而在CharsetDecoder中声明。那不可能是cd的实际类型,因为它是一个抽象类。

修改一下:

Class c = cd.getClass();

Class c = CharsetDecoder.class;

异常在该点消失。如果它适用于UTF-8和cp1252,这表明用于的类也声明了 decodeLoop,而对于UTF-16LEUTF-16BE,它们可能被继承。

相关内容

  • 没有找到相关文章

最新更新