On Fri, 3 Feb 2023 15:11:30 GMT, Adam Sotona <asot...@openjdk.org> wrote:

>> java.base java.lang.reflect.ProxyGenerator uses ASM to generate proxy 
>> classes and this patch converts it to use Classfile API.
>> 
>> This pull request suppose to chain on the 8294982: Implementation of 
>> Classfile API https://github.com/openjdk/jdk/pull/10982
>> 
>> Please review.
>> 
>> Thank you,
>> Adam
>
> Adam Sotona has updated the pull request with a new target base due to a 
> merge or a rebase. The incremental webrev excludes the unrelated changes 
> brought in by the merge/rebase. The pull request contains four additional 
> commits since the last revision:
> 
>  - j.l.r.ProxyGenerator fix - Classfile API moved under 
> jdk.internal.classfile package
>  - Merge branch 'JDK-8294982' into JDK-8294961
>  - Merge branch 'JDK-8294982' into JDK-8294961
>  - 8294961: java.base java.lang.reflect.ProxyGenerator uses ASM to generate 
> proxy classes

This looks good in general.   I like this, easy to use, easy to read and 
understand and greatly simplified.

Reviewing this is one easy way to study the ClassFile API.

src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java line 390:

> 388:             uniqueList.add(ex);
> 389:         }
> 390:         return uniqueList.stream().map(ex -> 
> ClassDesc.ofDescriptor(ex.descriptorString())).toList();

It would be useful to add a helper method to convert Class to ClassDesc:

     private static ClassDesc toClassDesc(Class<?> type) {
         return ClassDesc.ofDescriptor(type.descriptorString());
     }
     
Suggestion:

        return uniqueList.stream().map(ProxyGenerator::toClassDesc).toList();

src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java line 423:

> 421:     private byte[] generateClassFile() {
> 422:         var localCache = new HashMap<ClassDesc, 
> ClassHierarchyResolver.ClassHierarchyInfo>();
> 423:         return Classfile.build(classDesc, 
> List.of(Classfile.Option.classHierarchyResolver(classDesc ->

How/when is `ClassHierarchyResolver` being called?   I didn't dig deeper.

src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java line 664:

> 662:          */
> 663:         private void generateMethod(ClassBuilder clb, ClassDesc 
> className) {
> 664:             MethodTypeDesc desc = 
> MethodTypeDesc.ofDescriptor(MethodType.methodType(returnType, 
> parameterTypes).toMethodDescriptorString());

I slightly prefer to call `MethodType::descriptorString` that 
`descriptorString` is called for both `Class` and `MethodType`. 


MethodTypeDesc desc = 
MethodTypeDesc.ofDescriptor(MethodType.methodType(returnType, 
parameterTypes).descriptorString());


Alternatively, use `describeConstable` instead.


MethodTypeDesc desc = MethodType.methodType(returnType, 
parameterTypes).describeConstable().orElseThrow();

src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java line 665:

> 663:         private void generateMethod(ClassBuilder clb, ClassDesc 
> className) {
> 664:             MethodTypeDesc desc = 
> MethodTypeDesc.ofDescriptor(MethodType.methodType(returnType, 
> parameterTypes).toMethodDescriptorString());
> 665:             int accessFlags = (method.isVarArgs()) ? ACC_VARARGS | 
> ACC_PUBLIC | ACC_FINAL : ACC_PUBLIC | ACC_FINAL;

Nit: 
Suggestion:

            int accessFlags = (method.isVarArgs()) ? ACC_VARARGS | ACC_PUBLIC | 
ACC_FINAL
                                                   : ACC_PUBLIC | ACC_FINAL;

src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java line 672:

> 670:                         .stream()
> 671:                         .map(cpb::classEntry)
> 672:                         .toList();

Suggestion:

                List<ClassEntry> exceptionClassEntries = 
Arrays.asList(exceptionTypes)
                        .stream()
                        .map(ProxyGenerator::toClassDesc)
                        .map(cpb::classEntry)
                        .toList();


`typeNames` streams over the given types.   This can be simplified by mapping 
`Class` to `ClassDesc` in place here.   I would also suggest to add  the 
`toClassDesc` helper method.

-------------

PR: https://git.openjdk.org/jdk/pull/10991

Reply via email to