Discussion:
defineClass doesn't exist on extended ClassLoader
Nathan Faulkner
2018-02-23 01:39:47 UTC
Permalink
When extending java.lang.ClassLoader, I can't seem to execute defineClass.
Here's my test case showing the issue.

var superLoader = Java.super(new (Java.extend(java.lang.ClassLoader))(){});
// defineClass on the super object doesn't exist for some reason
print("defineClass: " + (superLoader.defineClass !== undefined));
// definePackage is protected, but isn't undefined, so that isn't the issue
print("definePackage: " + (superLoader.definePackage !== undefined));


and here's the output of "java -version":
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
Sundararajan Athijegannathan
2018-02-23 02:53:16 UTC
Permalink
Hi,

Two things:

* Nashorn allows access only to public methods and fields (of exported)
classes only.

* With Java.extend, Nashorn adds public overrides of all non-final
protected methods of the superclass.
ClassLoader.definePackage is non-final protected method.
ClassLoader.defineClass is final protected method.
Hence no override of ClassLoader.defineClass added to generated subclass.

-Sundar
Post by Nathan Faulkner
When extending java.lang.ClassLoader, I can't seem to execute defineClass.
Here's my test case showing the issue.
var superLoader = Java.super(new (Java.extend(java.lang.ClassLoader))(){});
// defineClass on the super object doesn't exist for some reason
print("defineClass: " + (superLoader.defineClass !== undefined));
// definePackage is protected, but isn't undefined, so that isn't the issue
print("definePackage: " + (superLoader.definePackage !== undefined));
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
Nathan Faulkner
2018-02-23 21:49:23 UTC
Permalink
Ah, so that's the difference (javadocs don't included "final" in method
summaries so I didn't notice). Guess this means I get to make an
enhancement request.

On Thu, Feb 22, 2018 at 9:53 PM, Sundararajan Athijegannathan <
Post by Sundararajan Athijegannathan
Hi,
* Nashorn allows access only to public methods and fields (of exported)
classes only.
* With Java.extend, Nashorn adds public overrides of all non-final
protected methods of the superclass.
ClassLoader.definePackage is non-final protected method.
ClassLoader.defineClass is final protected method.
Hence no override of ClassLoader.defineClass added to generated subclass.
-Sundar
Post by Nathan Faulkner
When extending java.lang.ClassLoader, I can't seem to execute defineClass.
Here's my test case showing the issue.
var superLoader = Java.super(new (Java.extend(java.lang.ClassLo
ader))(){});
// defineClass on the super object doesn't exist for some reason
print("defineClass: " + (superLoader.defineClass !== undefined));
// definePackage is protected, but isn't undefined, so that isn't the issue
print("definePackage: " + (superLoader.definePackage !== undefined));
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
Loading...