1
我一直試圖在Java中使用反射,這是我的代碼:的Java:NoSuchMethodException與反射的方法時,明顯存在
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」 - 很好
我應該如何解決這個問題?
你爲什麼這樣做呢? decodeLoop(in,out)的反射調用結果與使用官方API調用cd.onMalformedInput(CodingErrorAction.REPORT).decode(in,out,false)完全相同...... – Holger