44import sun .misc .Unsafe ;
55import sun .nio .ch .DirectBuffer ;
66
7+ //import java.lang.invoke.MethodHandle;
8+ //import java.lang.invoke.MethodHandles;
9+ //import java.lang.invoke.MethodType;
710import java .lang .reflect .Constructor ;
811import java .lang .reflect .Field ;
912import java .nio .BufferOverflowException ;
@@ -90,7 +93,21 @@ public class MessageBuffer {
9093 }
9194
9295 String bufferClsName = isLittleEndian ? "org.msgpack.core.buffer.MessageBuffer" : "org.msgpack.core.buffer.MessageBufferBE" ;
93- msgBufferClass = Class .forName (bufferClsName );
96+ Class <?> bufferCls = Class .forName (bufferClsName );
97+ msgBufferClass = bufferCls ;
98+
99+ Constructor <?> mbArrCstr = bufferCls .getDeclaredConstructor (byte [].class );
100+ mbArrCstr .setAccessible (true );
101+ mbArrConstructor = mbArrCstr ;
102+
103+ Constructor <?> mbBBCstr = bufferCls .getDeclaredConstructor (ByteBuffer .class );
104+ mbBBCstr .setAccessible (true );
105+ mbBBConstructor = mbBBCstr ;
106+
107+ // Requires Java7
108+ //newMsgBuffer = MethodHandles.lookup().unreflectConstructor(mbArrCstr).asType(
109+ // MethodType.methodType(bufferCls, byte[].class)
110+ //);
94111 }
95112 catch (Exception e ) {
96113 e .printStackTrace (System .err );
@@ -104,6 +121,13 @@ public class MessageBuffer {
104121 */
105122 private final static Class <?> msgBufferClass ;
106123
124+ private final static Constructor <?> mbArrConstructor ;
125+ private final static Constructor <?> mbBBConstructor ;
126+
127+
128+ // Requires Java7
129+ //private final static MethodHandle newMsgBuffer;
130+
107131 /**
108132 * Base object for resolving the relative address of the raw byte array.
109133 * If base == null, the address value is a raw memory address
@@ -163,11 +187,7 @@ private static MessageBuffer newMessageBuffer(ByteBuffer bb) {
163187 try {
164188 // We need to use reflection to create MessageBuffer instances in order to prevent TypeProfile generation for getInt method. TypeProfile will be
165189 // generated to resolve one of the method references when two or more classes overrides the method.
166- Constructor <?> constructor = msgBufferClass .getDeclaredConstructor (ByteBuffer .class );
167- return (MessageBuffer ) constructor .newInstance (bb );
168- }
169- catch (NoSuchMethodException e ) {
170- throw new IllegalStateException (e );
190+ return (MessageBuffer ) mbBBConstructor .newInstance (bb );
171191 }
172192 catch (Exception e ) {
173193 throw new RuntimeException (e );
@@ -182,12 +202,9 @@ private static MessageBuffer newMessageBuffer(ByteBuffer bb) {
182202 private static MessageBuffer newMessageBuffer (byte [] arr ) {
183203 checkNotNull (arr );
184204 try {
185- Constructor <?> constructor = msgBufferClass .getDeclaredConstructor (byte [].class );
186- return (MessageBuffer ) constructor .newInstance (arr );
205+ return (MessageBuffer ) mbArrConstructor .newInstance (arr );
187206 }
188- catch (NoSuchMethodException e ) {
189- throw new IllegalStateException (e );
190- } catch (Exception e ) {
207+ catch (Throwable e ) {
191208 throw new RuntimeException (e );
192209 }
193210 }
0 commit comments