Skip to content

Commit ce112a6

Browse files
committed
Minor attempts to further reduce creation of unnecessary temp buffers for Reflection (on readers)
1 parent 0e1a449 commit ce112a6

File tree

4 files changed

+25
-11
lines changed

4 files changed

+25
-11
lines changed

jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/api/MapBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ private final Map<String, Object> _map(int initialSize) {
163163
if (_mapType != null) {
164164
try {
165165
@SuppressWarnings("unchecked")
166-
Map<String,Object> m = (Map<String,Object>) _mapType.getDeclaredConstructor().newInstance();
166+
Map<String,Object> m = (Map<String,Object>)
167+
_mapType.getDeclaredConstructor().newInstance((Object[]) null);
167168
return m;
168169
} catch (Exception e) {
169170
Throwable t = e;

jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyReader.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,21 @@ public Class<?> rawSetterType() {
6969
public ValueReader getReader() { return _valueReader; }
7070
public String getName() { return _name; }
7171

72-
public void setValueFor(Object bean, Object value) throws IOException
72+
public void setValueFor(Object bean, Object[] valueBuf)
73+
throws IOException
7374
{
7475
try {
7576
if (_setter == null) {
76-
_field.set(bean, value);
77+
_field.set(bean, valueBuf[0]);
7778
} else {
78-
_setter.invoke(bean, value);
79+
_setter.invoke(bean, valueBuf);
7980
}
8081
} catch (Exception e) {
8182
Throwable t = e;
8283
if (t instanceof InvocationTargetException) {
8384
t = t.getCause();
8485
}
86+
final Object value = valueBuf[0];
8587
final String valueTypeDesc = (value == null) ? "NULL" : value.getClass().getName();
8688
throw new JSONObjectException(String.format(
8789
"Failed to set property '%s' (raw type %s) to value of type %s; exception (%s): %s",

jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public Object readNext(JSONReader r, JsonParser p) throws IOException
9393
case START_OBJECT:
9494
{
9595
Object bean = create();
96+
final Object[] valueBuf = r._setterBuffer;
9697
String propName;
9798

9899
for (; (propName = p.nextFieldName()) != null; ) {
@@ -101,14 +102,13 @@ public Object readNext(JSONReader r, JsonParser p) throws IOException
101102
handleUnknown(r, p, propName);
102103
continue;
103104
}
104-
ValueReader vr = prop.getReader();
105-
prop.setValueFor(bean, vr.readNext(r, p));
105+
valueBuf[0] = prop.getReader().readNext(r, p);
106+
prop.setValueFor(bean, valueBuf);
106107
}
107108
// also verify we are not confused...
108109
if (!p.hasToken(JsonToken.END_OBJECT)) {
109110
throw _reportProblem(p);
110111
}
111-
112112
return bean;
113113
}
114114
default:
@@ -145,15 +145,16 @@ public Object read(JSONReader r, JsonParser p) throws IOException
145145
{
146146
Object bean = create();
147147
String propName;
148+
final Object[] valueBuf = r._setterBuffer;
148149

149150
for (; (propName = p.nextFieldName()) != null; ) {
150151
BeanPropertyReader prop = findProperty(propName);
151152
if (prop == null) {
152153
handleUnknown(r, p, propName);
153154
continue;
154155
}
155-
final Object value = prop.getReader().readNext(r, p);
156-
prop.setValueFor(bean, value);
156+
valueBuf[0] = prop.getReader().readNext(r, p);
157+
prop.setValueFor(bean, valueBuf);
157158
}
158159
// also verify we are not confused...
159160
if (!p.hasToken(JsonToken.END_OBJECT)) {
@@ -179,7 +180,7 @@ protected Object create() throws Exception {
179180
if (_defaultCtor == null) {
180181
throw new IllegalStateException("Class "+_valueType.getName()+" does not have default constructor to use");
181182
}
182-
return _defaultCtor.newInstance();
183+
return _defaultCtor.newInstance((Object[]) null);
183184
}
184185

185186
protected Object create(String str) throws Exception {

jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/JSONReader.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class JSONReader
3939
* Handler that takes care of constructing {@link java.util.Map}s as needed
4040
*/
4141
protected final CollectionBuilder _collectionBuilder;
42-
42+
4343
/*
4444
/**********************************************************************
4545
/* Instance config, state
@@ -64,6 +64,14 @@ public class JSONReader
6464
*/
6565
protected final JsonParser _parser;
6666

67+
/**
68+
* Minor performance optimization: {@code Object[1]} reused to avoid
69+
* Reflection having to allocate it for every "setter" call.
70+
*
71+
* @since 2.13
72+
*/
73+
protected final Object[] _setterBuffer;
74+
6775
/*
6876
/**********************************************************************
6977
/* Blueprint construction
@@ -81,6 +89,7 @@ public JSONReader(CollectionBuilder lb, MapBuilder mb)
8189
_collectionBuilder = lb;
8290
_mapBuilder = mb;
8391
_parser = null;
92+
_setterBuffer = null; // should NOT be used on blueprint
8493
}
8594

8695
/**
@@ -96,6 +105,7 @@ protected JSONReader(JSONReader base, int features,
96105
_collectionBuilder = base._collectionBuilder.newBuilder(features);
97106
_mapBuilder = base._mapBuilder.newBuilder(features);
98107
_parser = p;
108+
_setterBuffer = new Object[1];
99109
}
100110

101111
/*

0 commit comments

Comments
 (0)