Skip to content

Commit dad0ade

Browse files
author
Joel Nelson
committed
use MessageBuffer constructor reflection only when required
1 parent 06e9ee7 commit dad0ade

File tree

1 file changed

+32
-19
lines changed

1 file changed

+32
-19
lines changed

msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBuffer.java

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -144,26 +144,33 @@ public class MessageBuffer
144144
bufferClsName = isLittleEndian ? DEFAULT_MESSAGE_BUFFER : BIGENDIAN_MESSAGE_BUFFER;
145145
}
146146

147-
try {
148-
// We need to use reflection here to find MessageBuffer implementation classes because
149-
// importing these classes creates TypeProfile and adds some overhead to method calls.
147+
if (DEFAULT_MESSAGE_BUFFER.equals(bufferClsName)) {
148+
// No need to use reflection here, we're not using a MessageBuffer subclass.
149+
mbArrConstructor = null;
150+
mbBBConstructor = null;
151+
}
152+
else {
153+
try {
154+
// We need to use reflection here to find MessageBuffer implementation classes because
155+
// importing these classes creates TypeProfile and adds some overhead to method calls.
150156

151-
// MessageBufferX (default, BE or U) class
152-
Class<?> bufferCls = Class.forName(bufferClsName);
157+
// MessageBufferX (default, BE or U) class
158+
Class<?> bufferCls = Class.forName(bufferClsName);
153159

154-
// MessageBufferX(byte[]) constructor
155-
Constructor<?> mbArrCstr = bufferCls.getDeclaredConstructor(byte[].class, int.class, int.class);
156-
mbArrCstr.setAccessible(true);
157-
mbArrConstructor = mbArrCstr;
160+
// MessageBufferX(byte[]) constructor
161+
Constructor<?> mbArrCstr = bufferCls.getDeclaredConstructor(byte[].class, int.class, int.class);
162+
mbArrCstr.setAccessible(true);
163+
mbArrConstructor = mbArrCstr;
158164

159-
// MessageBufferX(ByteBuffer) constructor
160-
Constructor<?> mbBBCstr = bufferCls.getDeclaredConstructor(ByteBuffer.class);
161-
mbBBCstr.setAccessible(true);
162-
mbBBConstructor = mbBBCstr;
163-
}
164-
catch (Exception e) {
165-
e.printStackTrace(System.err);
166-
throw new RuntimeException(e); // No more fallback exists if MessageBuffer constructors are inaccessible
165+
// MessageBufferX(ByteBuffer) constructor
166+
Constructor<?> mbBBCstr = bufferCls.getDeclaredConstructor(ByteBuffer.class);
167+
mbBBCstr.setAccessible(true);
168+
mbBBConstructor = mbBBCstr;
169+
}
170+
catch (Exception e) {
171+
e.printStackTrace(System.err);
172+
throw new RuntimeException(e); // No more fallback exists if MessageBuffer constructors are inaccessible
173+
}
167174
}
168175
}
169176
}
@@ -266,7 +273,10 @@ public static MessageBuffer wrap(ByteBuffer bb)
266273
private static MessageBuffer newMessageBuffer(byte[] arr, int off, int len)
267274
{
268275
checkNotNull(arr);
269-
return newInstance(mbArrConstructor, arr, off, len);
276+
if (mbArrConstructor != null) {
277+
return newInstance(mbArrConstructor, arr, off, len);
278+
}
279+
return new MessageBuffer(arr, off, len);
270280
}
271281

272282
/**
@@ -278,7 +288,10 @@ private static MessageBuffer newMessageBuffer(byte[] arr, int off, int len)
278288
private static MessageBuffer newMessageBuffer(ByteBuffer bb)
279289
{
280290
checkNotNull(bb);
281-
return newInstance(mbBBConstructor, bb);
291+
if (mbBBConstructor != null) {
292+
return newInstance(mbBBConstructor, bb);
293+
}
294+
return new MessageBuffer(bb);
282295
}
283296

284297
/**

0 commit comments

Comments
 (0)