Reputation: 2224
Cannot call ClassLoader.defineClass() from its subclass in Groovy
I am trying to build OpenClover on JDK17.
When I run an ant target clover-core.test
, the test com.atlassian.clover.ClassInstanceProxyTest
is failed with following log. It says the call of com.atlassian.clover.util.PrecannedClassLoader.defineClass()
cannot be assigned to any method:
Testsuite: com.atlassian.clover.ClassInstanceProxyTest
Tests run: 6, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.85 sec
Testcase: testDuplicates took 0.319 sec
Testcase: testClassAndClassloaderHashCollisionForClassesWithDifferentNames took 0.037 sec
Testcase: testNull took 0 sec
Testcase: testDifferentClassloaders took 0.342 sec
Caused an ERROR
No signature of method: com.atlassian.clover.util.PrecannedClassLoader.defineClass() is applicable for argument types: (java.lang.String, [B, java.lang.Integer, java.lang.Integer) values: [com.atlassian.clover.ClassInstanceProxy, [-54, -2, -70, -66, ...], ...]
groovy.lang.MissingMethodException: No signature of method: com.atlassian.clover.util.PrecannedClassLoader.defineClass() is applicable for argument types: (java.lang.String, [B, java.lang.Integer, java.lang.Integer) values: [com.atlassian.clover.ClassInstanceProxy, [-54, -2, -70, -66, ...], ...]
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:80)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:157)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:193)
at com.atlassian.clover.util.PrecannedClassLoader.findClass(PrecannedClassLoader.groovy:37)
at com.atlassian.clover.util.PrecannedClassLoader.loadClass(PrecannedClassLoader.groovy:16)
at com.atlassian.clover.util.PrecannedClassLoader$loadClass.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
at com.atlassian.clover.ClassInstanceProxyTest.testDifferentClassloaders(ClassInstanceProxyTest.groovy:51)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Testcase: testIdentiy took 0 sec
Testcase: testDifferent took 0 sec
com.atlassian.clover.util.PrecannedClassLoader
is a subclass of java.lang.ClassLoader
written in Groovy. java.lang.ClassLoader#defineClass(String name, byte[] b, int off, int len)
is a protected
method, so I think it should be called property from its subclasses.
I have tried to change the call of defineClass()
with super.defineClass()
to call the method on the parent class explicitly, but I got following error:
Testsuite: com.atlassian.clover.ClassInstanceProxyTest
Tests run: 6, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.748 sec
Testcase: testDuplicates took 0.299 sec
Testcase: testClassAndClassloaderHashCollisionForClassesWithDifferentNames took 0.037 sec
Testcase: testNull took 0.001 sec
Testcase: testDifferentClassloaders took 0.271 sec
Caused an ERROR
No signature of method: com.atlassian.clover.util.PrecannedClassLoader.defineClass() is applicable for argument types: (java.lang.String, [B, java.lang.Integer, java.lang.Integer) values: [com.atlassian.clover.ClassInstanceProxy, [-54, -2, -70, -66, ...], ...]
groovy.lang.MissingMethodException: No signature of method: com.atlassian.clover.util.PrecannedClassLoader.defineClass() is applicable for argument types: (java.lang.String, [B, java.lang.Integer, java.lang.Integer) values: [com.atlassian.clover.ClassInstanceProxy, [-54, -2, -70, -66, ...], ...]
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:147)
at com.atlassian.clover.util.PrecannedClassLoader.findClass(PrecannedClassLoader.groovy:37)
at com.atlassian.clover.util.PrecannedClassLoader.loadClass(PrecannedClassLoader.groovy:16)
at com.atlassian.clover.util.PrecannedClassLoader$loadClass.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
at com.atlassian.clover.ClassInstanceProxyTest.testDifferentClassloaders(ClassInstanceProxyTest.groovy:51)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Testcase: testIdentiy took 0.001 sec
Testcase: testDifferent took 0 sec
Why the call of defineClass()
on com.atlassian.clover.util.PrecannedClassLoader
properly refers java.lang.ClassLoader#defineClass()
in Groovy?
Upvotes: 0
Views: 131