RFR: 5043030 (reflect) unnecessary object creation in reflection (original) (raw)

Andrej Golovnin andrej.golovnin at gmail.com
Sat Jun 21 22:00:41 UTC 2014


Hi Joel,

sorry for late response. I was too busy with other things.

Again, I have very limited time to work on this. We are looking into

other changes in reflection that may or may not change and/or supersede this work.

Could you please share the details? I'm just curious.

I think this would be a fine contribution to get in to 9, a good baseline to build further work upon, but the scope has to be limited. Given the risk-reward here my bar for accepting this is quite high.

I'm looking forward to a rewritten test and some coverage information.

I have changed the test TestMethodReflectValueOf as you suggested and I have changed the summary of both tests too. You will find the changes in the attached patch. Here is the new webrev: https://db.tt/wQBLVceA

And here is the coverage report in the HTML format:

https://db.tt/JTZjpnMM

Let me know if you need the coverage report in the text format.

Best regards, Andrej Golovnin -------------- next part -------------- diff --git a/src/share/classes/sun/reflect/AccessorGenerator.java b/src/share/classes/sun/reflect/AccessorGenerator.java --- a/src/share/classes/sun/reflect/AccessorGenerator.java +++ b/src/share/classes/sun/reflect/AccessorGenerator.java @@ -69,33 +69,34 @@ protected short codeIdx; protected short exceptionsIdx; // Boxing

@@ -181,9 +182,10 @@ /** Constant pool entries required to be able to box/unbox primitive types. Note that we don't emit these if we don't need them. */ protected void emitBoxingContantPoolEntries() {

@@ -192,7 +194,7 @@ // * [CONSTANT_Methodref_info] for above // * [UTF-8] "java/lang/Byte" // * [CONSTANT_Class_info] for above

@@ -201,7 +203,7 @@ // * [CONSTANT_Methodref_info] for above // * [UTF-8] "java/lang/Character" // * [CONSTANT_Class_info] for above

@@ -210,7 +212,7 @@ // * [CONSTANT_Methodref_info] for above // * [UTF-8] "java/lang/Double" // * [CONSTANT_Class_info] for above

@@ -219,7 +221,7 @@ // * [CONSTANT_Methodref_info] for above // * [UTF-8] "java/lang/Float" // * [CONSTANT_Class_info] for above

@@ -228,7 +230,7 @@ // * [CONSTANT_Methodref_info] for above // * [UTF-8] "java/lang/Integer" // * [CONSTANT_Class_info] for above

@@ -237,7 +239,7 @@ // * [CONSTANT_Methodref_info] for above // * [UTF-8] "java/lang/Long" // * [CONSTANT_Class_info] for above

@@ -246,21 +248,26 @@ // * [CONSTANT_Methodref_info] for above // * [UTF-8] "java/lang/Short" // * [CONSTANT_Class_info] for above

@@ -271,10 +278,10 @@ asm.emitConstantPoolUTF8("java/lang/Byte"); asm.emitConstantPoolClass(asm.cpi()); byteIdx = asm.cpi();

@@ -285,10 +292,10 @@ asm.emitConstantPoolUTF8("java/lang/Character"); asm.emitConstantPoolClass(asm.cpi()); characterIdx = asm.cpi();

@@ -299,10 +306,10 @@ asm.emitConstantPoolUTF8("java/lang/Double"); asm.emitConstantPoolClass(asm.cpi()); doubleIdx = asm.cpi();

@@ -313,10 +320,10 @@ asm.emitConstantPoolUTF8("java/lang/Float"); asm.emitConstantPoolClass(asm.cpi()); floatIdx = asm.cpi();

@@ -327,10 +334,10 @@ asm.emitConstantPoolUTF8("java/lang/Integer"); asm.emitConstantPoolClass(asm.cpi()); integerIdx = asm.cpi();

@@ -341,10 +348,10 @@ asm.emitConstantPoolUTF8("java/lang/Long"); asm.emitConstantPoolClass(asm.cpi()); longIdx = asm.cpi();

@@ -355,10 +362,10 @@ asm.emitConstantPoolUTF8("java/lang/Short"); asm.emitConstantPoolClass(asm.cpi()); shortIdx = asm.cpi();

@@ -515,23 +522,23 @@ throw new InternalError("Should have found primitive type"); }

diff --git a/src/share/classes/sun/reflect/UnsafeBooleanFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeBooleanFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeBooleanFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeBooleanFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeByteFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeByteFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeByteFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeByteFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeCharacterFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeCharacterFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeCharacterFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeCharacterFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeDoubleFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeDoubleFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeDoubleFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeDoubleFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeFloatFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeFloatFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeFloatFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeFloatFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeIntegerFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeIntegerFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeIntegerFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeIntegerFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeLongFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeLongFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeLongFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeLongFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedBooleanFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedBooleanFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedBooleanFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedBooleanFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedByteFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedByteFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedByteFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedByteFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedCharacterFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedCharacterFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedCharacterFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedCharacterFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedDoubleFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedDoubleFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedDoubleFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedDoubleFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedFloatFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedFloatFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedFloatFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedFloatFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedIntegerFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedIntegerFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedIntegerFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedIntegerFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedLongFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedLongFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedLongFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedLongFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedShortFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedShortFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedShortFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedShortFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedStaticBooleanFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedStaticBooleanFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedStaticBooleanFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedStaticBooleanFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedStaticByteFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedStaticByteFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedStaticByteFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedStaticByteFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedStaticCharacterFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedStaticCharacterFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedStaticCharacterFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedStaticCharacterFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedStaticDoubleFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedStaticDoubleFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedStaticDoubleFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedStaticDoubleFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedStaticFloatFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedStaticFloatFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedStaticFloatFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedStaticFloatFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeQualifiedStaticShortFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeQualifiedStaticShortFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeQualifiedStaticShortFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeQualifiedStaticShortFieldAccessorImpl.java @@ -35,7 +35,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeShortFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeShortFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeShortFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeShortFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeStaticBooleanFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeStaticBooleanFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeStaticBooleanFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeStaticBooleanFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeStaticByteFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeStaticByteFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeStaticByteFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeStaticByteFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeStaticCharacterFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeStaticCharacterFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeStaticCharacterFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeStaticCharacterFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeStaticDoubleFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeStaticDoubleFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeStaticDoubleFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeStaticDoubleFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeStaticFloatFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeStaticFloatFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeStaticFloatFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeStaticFloatFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeStaticIntegerFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeStaticIntegerFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeStaticIntegerFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeStaticIntegerFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeStaticLongFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeStaticLongFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeStaticLongFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeStaticLongFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/src/share/classes/sun/reflect/UnsafeStaticShortFieldAccessorImpl.java b/src/share/classes/sun/reflect/UnsafeStaticShortFieldAccessorImpl.java --- a/src/share/classes/sun/reflect/UnsafeStaticShortFieldAccessorImpl.java +++ b/src/share/classes/sun/reflect/UnsafeStaticShortFieldAccessorImpl.java @@ -33,7 +33,7 @@ }

 public Object get(Object obj) throws IllegalArgumentException {

diff --git a/test/java/lang/reflect/Field/TestFieldReflectValueOf.java b/test/java/lang/reflect/Field/TestFieldReflectValueOf.java new file mode 100644 --- /dev/null +++ b/test/java/lang/reflect/Field/TestFieldReflectValueOf.java @@ -0,0 +1,173 @@ +/*



More information about the core-libs-dev mailing list