I've been trying to use Reflection in Java, Here's my code:
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);
}
Method clearly exists. Java source:
package java.nio.charset;
public abstract class CharsetDecoder {
...
protected abstract CoderResult decodeLoop(ByteBuffer in,
CharBuffer out);
...
}
The output:
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)
...
if I use a parameter charsetName as
How I'm supposed to fix this?

You're calling getDeclaredMethod on the actual type of cd, whereas it's declared in CharsetDecoder. That can't be the actual type of cd given that it's an abstract class.
Just change this:
Class c = cd.getClass();
to
Class c = CharsetDecoder.class;
The exception goes away at that point. If it's working for UTF-8 and cp1252, that suggests that the classes that are used for that also declare decodeLoop, whereas for UTF-16LE and UTF-16BE they're potentially inherited.
See more on this question at Stackoverflow