我一直在尝试使用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 作为
我该如何解决这个问题?
答案 0 :(得分:4)
您在[{1}}的实际类型上调用了getDeclaredMethod
,而在{{1}中 }}。鉴于它是一个抽象类,这不是cd
的实际类型。
只需改变一下:
CharsetDecoder
到
cd
此时例外消失了。如果它适用于UTF-8和cp1252,则表明用于该的类也声明Class c = cd.getClass();
,而Class c = CharsetDecoder.class;
和{{1}他们可能会继承。