sofastack / sofa-rpc

SOFARPC is a high-performance, high-extensibility, production-level Java RPC framework.
https://www.sofastack.tech/sofa-rpc/docs/Home
Apache License 2.0
3.81k stars 1.17k forks source link

feat: let use of javassist compatible both under java 17 and java 1.8 #1316

Closed Lo1nt closed 1 year ago

Lo1nt commented 1 year ago

Motivation:

Running com.alipay.sofa.rpc.proxy.javassist.JavassistProxyTest encounters error under jdk 17

        com.alipay.sofa.rpc.core.exception.SofaRpcRuntimeException: RPC-010080001: Construct proxy with [javassist] occurs error. 
    at com.alipay.sofa.rpc.proxy.javassist.JavassistProxy.getProxy(JavassistProxy.java:142)
    at com.alipay.sofa.rpc.proxy.javassist.JavassistProxyTest.getProxy(JavassistProxyTest.java:52)
        ......
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @17f052a3
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
    at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:159)
    at javassist.util.proxy.DefineClassHelper$JavaOther.defineClass(DefineClassHelper.java:213)
    at javassist.util.proxy.DefineClassHelper$Java11.defineClass(DefineClassHelper.java:52)
    at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:260)
    at javassist.ClassPool.toClass(ClassPool.java:1240)
    at javassist.ClassPool.toClass(ClassPool.java:1098)
    at javassist.ClassPool.toClass(ClassPool.java:1056)
    at javassist.CtClass.toClass(CtClass.java:1298)
    at com.alipay.sofa.rpc.proxy.javassist.JavassistProxy.getProxy(JavassistProxy.java:131)

For java 11+, if no neighbour params passed to ClassPool.toClass, the javassist.util.proxy.DefineClassHelper would make a reflection call to java.lang.ClassLoader.DefineClass, which is, however, inaccessbile from unnamed module under java 17.

Modification:

Use javassist.ClassPool#toClass(javassist.CtClass, java.lang.Class<?>, java.lang.ClassLoader, java.security.ProtectionDomain) instead of javassist.CtClass#toClass().

Result:

com.alipay.sofa.rpc.proxy.javassist.JavassistProxyTest works both under java 17 and java 1.8.

codecov[bot] commented 1 year ago

Codecov Report

Merging #1316 (91b8c3b) into master (a283eb3) will increase coverage by 0.02%. The diff coverage is 100.00%.

@@             Coverage Diff              @@
##             master    #1316      +/-   ##
============================================
+ Coverage     72.02%   72.05%   +0.02%     
+ Complexity      786      784       -2     
============================================
  Files           415      415              
  Lines         17651    17653       +2     
  Branches       2753     2753              
============================================
+ Hits          12714    12720       +6     
+ Misses         3536     3532       -4     
  Partials       1401     1401              
Impacted Files Coverage Δ
...lipay/sofa/rpc/proxy/javassist/JavassistProxy.java 79.24% <100.00%> (+0.26%) :arrow_up:

... and 9 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.