src/jdk/nashorn/internal/runtime/NativeJavaPackage.java
Print this page
rev 746 : 8031715: Indexed access to java package not working
Reviewed-by: lagergren, hannesw
rev 760 : 8037400: Remove getInitialMap getters and GlobalObject interface
Reviewed-by: lagergren, jlaskey, attila
@@ -33,11 +33,10 @@
import jdk.internal.dynalink.linker.GuardedInvocation;
import jdk.internal.dynalink.linker.LinkRequest;
import jdk.internal.dynalink.support.Guards;
import jdk.nashorn.internal.lookup.MethodHandleFactory;
import jdk.nashorn.internal.lookup.MethodHandleFunctionality;
-import jdk.nashorn.internal.objects.NativeJava;
import jdk.nashorn.internal.objects.annotations.Attribute;
import jdk.nashorn.internal.objects.annotations.Function;
/**
* An object that exposes Java packages and classes as its properties. Packages are exposed as objects that have further
@@ -50,11 +49,11 @@
* or you can store the type objects in a variable for later reuse:
* <pre>
* var ArrayList = java.util.ArrayList
* var list = new ArrayList
* </pre>
- * You can also use {@link NativeJava#type(Object, Object)} to access Java classes. These two statements are mostly
+ * You can also use {@link jdk.nashorn.internal.objects.NativeJava#type(Object, Object)} to access Java classes. These two statements are mostly
* equivalent:
* <pre>
* var listType1 = java.util.ArrayList
* var listType2 = Java.type("java.util.ArrayList")
* </pre>
@@ -196,34 +195,45 @@
* @return Link to be invoked at call site.
*/
@Override
public GuardedInvocation noSuchProperty(final CallSiteDescriptor desc, final LinkRequest request) {
final String propertyName = desc.getNameToken(2);
- final String fullName = name.isEmpty() ? propertyName : name + "." + propertyName;
+ createProperty(propertyName);
+ return super.lookup(desc, request);
+ }
+
+ @Override
+ protected Object invokeNoSuchProperty(final String name) {
+ return createProperty(name);
+ }
+
+ @Override
+ public GuardedInvocation noSuchMethod(final CallSiteDescriptor desc, final LinkRequest request) {
+ return noSuchProperty(desc, request);
+ }
+
+ private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
+ return MH.findStatic(MethodHandles.lookup(), NativeJavaPackage.class, name, MH.type(rtype, types));
+ }
+ private Object createProperty(final String propertyName) {
+ final String fullName = name.isEmpty() ? propertyName : name + "." + propertyName;
final Context context = Context.getContextTrusted();
Class<?> javaClass = null;
try {
javaClass = context.findClass(fullName);
} catch (final NoClassDefFoundError | ClassNotFoundException e) {
//ignored
}
+ final Object propertyValue;
if (javaClass == null) {
- set(propertyName, new NativeJavaPackage(fullName, getProto()), false);
+ propertyValue = new NativeJavaPackage(fullName, getProto());
} else {
- set(propertyName, StaticClass.forClass(javaClass), false);
+ propertyValue = StaticClass.forClass(javaClass);
}
- return super.lookup(desc, request);
- }
-
- @Override
- public GuardedInvocation noSuchMethod(final CallSiteDescriptor desc, final LinkRequest request) {
- return noSuchProperty(desc, request);
- }
-
- private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
- return MH.findStatic(MethodHandles.lookup(), NativeJavaPackage.class, name, MH.type(rtype, types));
+ set(propertyName, propertyValue, false);
+ return propertyValue;
}
}