nashorn/src/jdk/internal/dynalink/beans/StaticClassLinker.java
changeset 18876 ada98218aaae
parent 18841 9bbc4b8832b2
child 19093 49bb7e75b326
equal deleted inserted replaced
18874:8ba96bd382d3 18876:ada98218aaae
    86 import java.lang.invoke.MethodHandle;
    86 import java.lang.invoke.MethodHandle;
    87 import java.lang.invoke.MethodHandles;
    87 import java.lang.invoke.MethodHandles;
    88 import java.lang.invoke.MethodType;
    88 import java.lang.invoke.MethodType;
    89 import java.lang.reflect.Array;
    89 import java.lang.reflect.Array;
    90 import java.util.Arrays;
    90 import java.util.Arrays;
       
    91 import java.util.Collection;
    91 import jdk.internal.dynalink.CallSiteDescriptor;
    92 import jdk.internal.dynalink.CallSiteDescriptor;
    92 import jdk.internal.dynalink.beans.GuardedInvocationComponent.ValidationType;
    93 import jdk.internal.dynalink.beans.GuardedInvocationComponent.ValidationType;
    93 import jdk.internal.dynalink.linker.GuardedInvocation;
    94 import jdk.internal.dynalink.linker.GuardedInvocation;
    94 import jdk.internal.dynalink.linker.GuardingDynamicLinker;
       
    95 import jdk.internal.dynalink.linker.LinkRequest;
    95 import jdk.internal.dynalink.linker.LinkRequest;
    96 import jdk.internal.dynalink.linker.LinkerServices;
    96 import jdk.internal.dynalink.linker.LinkerServices;
    97 import jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker;
    97 import jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker;
    98 import jdk.internal.dynalink.support.Lookup;
    98 import jdk.internal.dynalink.support.Lookup;
    99 
    99 
   100 /**
   100 /**
   101  * Provides a linker for the {@link StaticClass} objects.
   101  * Provides a linker for the {@link StaticClass} objects.
   102  * @author Attila Szegedi
   102  * @author Attila Szegedi
   103  */
   103  */
   104 class StaticClassLinker implements TypeBasedGuardingDynamicLinker {
   104 class StaticClassLinker implements TypeBasedGuardingDynamicLinker {
   105     private final ClassValue<GuardingDynamicLinker> linkers = new ClassValue<GuardingDynamicLinker>() {
   105     private static final ClassValue<SingleClassStaticsLinker> linkers = new ClassValue<SingleClassStaticsLinker>() {
   106         @Override
   106         @Override
   107         protected GuardingDynamicLinker computeValue(Class<?> clazz) {
   107         protected SingleClassStaticsLinker computeValue(Class<?> clazz) {
   108             return new SingleClassStaticsLinker(clazz);
   108             return new SingleClassStaticsLinker(clazz);
   109         }
   109         }
   110     };
   110     };
   111 
   111 
   112     private static class SingleClassStaticsLinker extends AbstractJavaLinker {
   112     private static class SingleClassStaticsLinker extends AbstractJavaLinker {
   158             }
   158             }
   159             return null;
   159             return null;
   160         }
   160         }
   161     }
   161     }
   162 
   162 
       
   163     static Collection<String> getReadableStaticPropertyNames(Class<?> clazz) {
       
   164         return linkers.get(clazz).getReadablePropertyNames();
       
   165     }
       
   166 
       
   167     static Collection<String> getWritableStaticPropertyNames(Class<?> clazz) {
       
   168         return linkers.get(clazz).getWritablePropertyNames();
       
   169     }
       
   170 
       
   171     static Collection<String> getStaticMethodNames(Class<?> clazz) {
       
   172         return linkers.get(clazz).getMethodNames();
       
   173     }
       
   174 
   163     @Override
   175     @Override
   164     public GuardedInvocation getGuardedInvocation(LinkRequest request, LinkerServices linkerServices) throws Exception {
   176     public GuardedInvocation getGuardedInvocation(LinkRequest request, LinkerServices linkerServices) throws Exception {
   165         final Object receiver = request.getReceiver();
   177         final Object receiver = request.getReceiver();
   166         if(receiver instanceof StaticClass) {
   178         if(receiver instanceof StaticClass) {
   167             return linkers.get(((StaticClass)receiver).getRepresentedClass()).getGuardedInvocation(request,
   179             return linkers.get(((StaticClass)receiver).getRepresentedClass()).getGuardedInvocation(request,