/* * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.max.vm.jdk; import java.util.regex.*; import com.sun.max.annotate.*; import com.sun.max.lang.*; import com.sun.max.vm.actor.holder.*; /** * This class implements a centralized place for naming specific classes in the JDK that are referenced * explicitly in other parts of the VM. */ public class JDK { // Checkstyle: stop field name check public static final ClassRef java_lang_ApplicationShutdownHooks = new ClassRef("java.lang.ApplicationShutdownHooks"); public static final ClassRef java_lang_Class = new ClassRef(Class.class); public static final ClassRef java_lang_ClassLoader = new ClassRef(ClassLoader.class); public static final ClassRef java_lang_ClassLoader$NativeLibrary = new ClassRef(ClassLoader.class, "NativeLibrary"); public static final ClassRef java_lang_Cloneable = new ClassRef(Cloneable.class); public static final ClassRef java_lang_Compiler = new ClassRef(Compiler.class); public static final ClassRef java_lang_Object = new ClassRef(Object.class); public static final ClassRef java_lang_Package = new ClassRef(java.lang.Package.class); public static final ClassRef java_lang_ProcessEnvironment = new ClassRef("java.lang.ProcessEnvironment"); public static final ClassRef java_lang_Runtime = new ClassRef(Runtime.class); public static final ClassRef java_lang_Shutdown = new ClassRef("java.lang.Shutdown"); public static final ClassRef java_lang_String = new ClassRef(String.class); public static final ClassRef java_lang_System = new ClassRef(System.class); public static final ClassRef java_lang_Thread = new ClassRef(Thread.class); public static final ClassRef java_lang_Throwable = new ClassRef(Throwable.class); public static final ClassRef java_lang_Terminator = new ClassRef("java.lang.Terminator"); public static final ClassRef java_lang_invoke_MethodType = new LazyClassRef("java.lang.invoke.MethodType"); public static final ClassRef java_lang_ref_Finalizer = new ClassRef("java.lang.ref.Finalizer"); public static final ClassRef java_lang_ref_Finalizer$FinalizerThread = new ClassRef("java.lang.ref.Finalizer$FinalizerThread"); public static final ClassRef java_lang_ref_Reference = new ClassRef(java.lang.ref.Reference.class); public static final ClassRef java_lang_ref_SoftReference = new ClassRef(java.lang.ref.SoftReference.class); public static final ClassRef java_lang_ref_Reference$ReferenceHandler = new ClassRef(java.lang.ref.Reference.class, "ReferenceHandler"); public static final ClassRef java_lang_ref_ReferenceQueue = new ClassRef(java.lang.ref.ReferenceQueue.class); public static final ClassRef java_io_Serializable = new ClassRef(java.io.Serializable.class); public static final ClassRef java_io_UnixFileSystem = new ClassRef("java.io.UnixFileSystem", true); public static final ClassRef java_io_ExpiringCache = new ClassRef("java.io.ExpiringCache"); public static final ClassRef java_nio_DirectByteBuffer = new LazyClassRef("java.nio.DirectByteBuffer"); public static final ClassRef java_nio_DirectCharBufferS = new LazyClassRef("java.nio.DirectCharBufferS"); public static final ClassRef java_nio_DirectCharBufferU = new LazyClassRef("java.nio.DirectCharBufferU"); public static final ClassRef java_nio_DirectDoubleBufferS = new LazyClassRef("java.nio.DirectDoubleBufferS"); public static final ClassRef java_nio_DirectDoubleBufferU = new LazyClassRef("java.nio.DirectDoubleBufferU"); public static final ClassRef java_nio_DirectFloatBufferS = new LazyClassRef("java.nio.DirectFloatBufferS"); public static final ClassRef java_nio_DirectFloatBufferU = new LazyClassRef("java.nio.DirectFloatBufferU"); public static final ClassRef java_nio_DirectIntBufferS = new LazyClassRef("java.nio.DirectIntBufferS"); public static final ClassRef java_nio_DirectIntBufferU = new LazyClassRef("java.nio.DirectIntBufferU"); public static final ClassRef java_nio_DirectLongBufferS = new LazyClassRef("java.nio.DirectLongBufferS"); public static final ClassRef java_nio_DirectLongBufferU = new LazyClassRef("java.nio.DirectLongBufferU"); public static final ClassRef java_nio_DirectShortBufferS = new LazyClassRef("java.nio.DirectShortBufferS"); public static final ClassRef java_nio_DirectShortBufferU = new LazyClassRef("java.nio.DirectShortBufferU"); public static final ClassRef java_nio_charset_CharsetEncoder = new LazyClassRef(java.nio.charset.CharsetEncoder.class); public static final ClassRef java_lang_reflect_Constructor = new ClassRef(java.lang.reflect.Constructor.class); public static final ClassRef java_lang_reflect_Field = new ClassRef(java.lang.reflect.Field.class); public static final ClassRef java_lang_reflect_Method = new ClassRef(java.lang.reflect.Method.class); public static final ClassRef java_lang_reflect_Proxy = new LazyClassRef(java.lang.reflect.Proxy.class); public static final ClassRef java_util_EnumMap = new ClassRef(java.util.EnumMap.class); public static final ClassRef java_util_Random = new ClassRef(java.util.Random.class); public static final ClassRef java_util_Hashtable = new ClassRef(java.util.Hashtable.class); public static final ClassRef java_util_HashMap = new ClassRef(java.util.HashMap.class); public static final ClassRef java_util_HashMap_Holder = new ClassRef("java.util.HashMap$Holder", true); public static final ClassRef java_math_BigInteger = new LazyClassRef(java.math.BigInteger.class); public static final ClassRef java_util_concurrent_ConcurrentSkipListSet = new LazyClassRef(java.util.concurrent.ConcurrentSkipListSet.class); public static final ClassRef java_util_concurrent_ConcurrentLinkedQueue= new LazyClassRef(java.util.concurrent.ConcurrentLinkedQueue.class); public static final ClassRef java_util_concurrent_CopyOnWriteArrayList = new LazyClassRef(java.util.concurrent.CopyOnWriteArrayList.class); public static final ClassRef java_util_concurrent_ConcurrentHashMap = new LazyClassRef(java.util.concurrent.ConcurrentHashMap.class); public static final ClassRef java_util_concurrent_ConcurrentHashMap$HashEntry = new LazyClassRef(java.util.concurrent.ConcurrentHashMap.class, "HashEntry"); public static final ClassRef java_util_concurrent_SynchronousQueue = new LazyClassRef(java.util.concurrent.SynchronousQueue.class); public static final ClassRef java_util_concurrent_SynchronousQueue$TransferStack = new LazyClassRef(java.util.concurrent.SynchronousQueue.class, "TransferStack"); public static final ClassRef java_util_concurrent_SynchronousQueue$TransferStack$SNode = new LazyClassRef(java.util.concurrent.SynchronousQueue.class, "TransferStack$SNode"); public static final ClassRef java_util_concurrent_SynchronousQueue$TransferQueue = new LazyClassRef(java.util.concurrent.SynchronousQueue.class, "TransferQueue"); public static final ClassRef java_util_concurrent_SynchronousQueue$TransferQueue$QNode = new LazyClassRef(java.util.concurrent.SynchronousQueue.class, "TransferQueue$QNode"); public static final ClassRef java_util_concurrent_ForkJoinPool = new LazyClassRef("java.util.concurrent.ForkJoinPool"); public static final ClassRef java_util_concurrent_ForkJoinWorkerThread = new LazyClassRef("java.util.concurrent.ForkJoinWorkerThread"); public static final ClassRef java_util_concurrent_ForkJoinTask = new LazyClassRef("java.util.concurrent.ForkJoinTask"); public static final ClassRef java_util_concurrent_atomic_AtomicBoolean = new LazyClassRef(java.util.concurrent.atomic.AtomicBoolean.class); public static final ClassRef java_util_concurrent_atomic_AtomicInteger = new LazyClassRef(java.util.concurrent.atomic.AtomicInteger.class); public static final ClassRef java_util_concurrent_atomic_AtomicLong = new LazyClassRef(java.util.concurrent.atomic.AtomicLong.class); public static final ClassRef java_util_concurrent_atomic_AtomicReference = new LazyClassRef(java.util.concurrent.atomic.AtomicReference.class); public static final ClassRef java_util_concurrent_atomic_AtomicIntegerArray = new LazyClassRef(java.util.concurrent.atomic.AtomicIntegerArray.class); public static final ClassRef java_util_concurrent_atomic_AtomicLongArray = new LazyClassRef(java.util.concurrent.atomic.AtomicLongArray.class); public static final ClassRef java_util_concurrent_atomic_AtomicReferenceArray = new LazyClassRef(java.util.concurrent.atomic.AtomicReferenceArray.class); public static final ClassRef java_util_concurrent_atomic_AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl = new LazyClassRef(java.util.concurrent.atomic.AtomicReferenceFieldUpdater.class, "AtomicReferenceFieldUpdaterImpl"); public static final ClassRef java_util_concurrent_atomic_AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl = new LazyClassRef(java.util.concurrent.atomic.AtomicIntegerFieldUpdater.class, "AtomicIntegerFieldUpdaterImpl"); public static final ClassRef java_util_concurrent_atomic_AtomicLongFieldUpdater$CASUpdater = new LazyClassRef(java.util.concurrent.atomic.AtomicLongFieldUpdater.class, "CASUpdater"); public static final ClassRef java_util_concurrent_atomic_AtomicLongFieldUpdater$LockedUpdater = new LazyClassRef(java.util.concurrent.atomic.AtomicLongFieldUpdater.class, "LockedUpdater"); public static final ClassRef java_util_concurrent_atomic_AtomicStampedReference = new LazyClassRef(java.util.concurrent.atomic.AtomicStampedReference.class); public static final ClassRef java_util_concurrent_atomic_AtomicMarkableReference = new LazyClassRef(java.util.concurrent.atomic.AtomicMarkableReference.class); public static final ClassRef java_util_concurrent_locks_AbstractQueuedSynchronizer = new LazyClassRef(java.util.concurrent.locks.AbstractQueuedSynchronizer.class); public static final ClassRef java_util_concurrent_locks_AbstractQueuedSynchronizer$Node = new LazyClassRef(java.util.concurrent.locks.AbstractQueuedSynchronizer.class, "Node"); public static final ClassRef java_util_concurrent_locks_AbstractQueuedLongSynchronizer = new LazyClassRef(java.util.concurrent.locks.AbstractQueuedLongSynchronizer.class); public static final ClassRef java_util_concurrent_locks_AbstractQueuedLongSynchronizer$Node = new LazyClassRef(java.util.concurrent.locks.AbstractQueuedLongSynchronizer.class, "Node"); public static final ClassRef java_util_concurrent_locks_LockSupport = new LazyClassRef(java.util.concurrent.locks.LockSupport.class); public static final ClassRef sun_misc_VM = new ClassRef(sun.misc.VM.class); public static final ClassRef sun_misc_Version = new ClassRef(sun.misc.Version.class); public static final ClassRef sun_misc_SharedSecrets = new ClassRef(sun.misc.SharedSecrets.class); public static final ClassRef sun_misc_Unsafe = new ClassRef(sun.misc.Unsafe.class); public static final ClassRef sun_misc_PerfCounter = new LazyClassRef("sun.misc.PerfCounter"); public static final ClassRef sun_misc_ProxyGenerator = new LazyClassRef("sun.misc.ProxyGenerator"); public static final ClassRef sun_misc_Launcher = new LazyClassRef(sun.misc.Launcher.class); public static final ClassRef sun_util_calendar_ZoneInfo = new LazyClassRef(sun.util.calendar.ZoneInfo.class); public static final ClassRef sun_net_www_protocol_jar_JarFileFactory = new LazyClassRef("sun.net.www.protocol.jar.JarFileFactory"); public static final ClassRef sun_reflect_annotation_AnnotationParser = new ClassRef(sun.reflect.annotation.AnnotationParser.class); public static final ClassRef sun_reflect_Reflection = new ClassRef(sun.reflect.Reflection.class); public static final ClassRef sun_reflect_ReflectionFactory = new ClassRef(sun.reflect.ReflectionFactory.class); public static final ClassRef sun_reflect_ConstantPool = new ClassRef(sun.reflect.ConstantPool.class); public static final ClassRef sun_security_action_GetPropertyAction = new ClassRef(sun.security.action.GetPropertyAction.class); public static final ClassRef sun_security_jca_ProviderConfig = new LazyClassRef("sun.security.jca.ProviderConfig"); // Checkstyle: resume field name check public static class ClassRef { @CONSTANT_WHEN_NOT_ZERO protected Class javaClass; @CONSTANT_WHEN_NOT_ZERO protected ClassActor classActor; @HOSTED_ONLY public ClassRef(Class javaClass) { this.javaClass = javaClass; } @HOSTED_ONLY public ClassRef(Class javaClass, String inner) { this.javaClass = Classes.forName(javaClass.getName() + "$" + inner); } @HOSTED_ONLY public ClassRef(String name) { try { javaClass = Class.forName(name); } catch (ClassNotFoundException e) { } } @HOSTED_ONLY public ClassRef(String name, boolean optional) { try { javaClass = Class.forName(name); } catch (ClassNotFoundException e) { if (!optional) { throw new NoClassDefFoundError(name); } } } public String className() { return javaClass.getName(); } public Class javaClass() { return javaClass; } @INLINE public final ClassActor classActor() { if (classActor == null) { getClassActor(); } return classActor; } public void resolveClassActor() { if (javaClass != null) { classActor(); } } private void getClassActor() { final ClassActor classActor = ClassActor.fromJava(javaClass()); // check again that the class actor has not already been set. Some ClassRefs will automatically be // updated when their classes are added to the VM class registry if (this.classActor == null) { this.classActor = classActor; } assert this.classActor == classActor : "wrong class actor registered with this ClassRef"; } } public static class LazyClassRef extends ClassRef { private final String className; @HOSTED_ONLY public LazyClassRef(String className) { super((Class) null); this.className = className; } @HOSTED_ONLY public LazyClassRef(Class javaClass) { super((Class) null); className = javaClass.getName(); } @HOSTED_ONLY public LazyClassRef(Class javaClass, String inner) { super((Class) null); className = javaClass.getName() + "$" + inner; } @Override public String className() { return className; } @Override public final Class javaClass() { return Classes.forName(className); } } /** * The format supported for JDK version strings. */ public static final Pattern JDK_VERSION_STRING_PATTERN = Pattern.compile("1.(\\d+)"); /** * JDK version string extract from the "java.specification.version" system property. */ public static final String JDK_VERSION_STRING = System.getProperty("java.specification.version"); /** * Version number of the JDK. */ public static final int JDK_VERSION = jdkVersionValue(JDK_VERSION_STRING); /** * Value for {@linkplain JDK_VERSION} for JDK 6. */ public static final int JDK_6 = 6; /** * Value for {@linkplain JDK_VERSION} for JDK 7. */ public static final int JDK_7 = 7; /** * Parses a JDK version string into an integer. * * @param version a version string that must conform to {@link #JDK_VERSION_STRING_PATTERN} * @return the integer value following the decimal in {@code version} */ public static int jdkVersionValue(String version) { Matcher m = JDK_VERSION_STRING_PATTERN.matcher(version); if (!m.matches()) { throw new IllegalArgumentException(version + " is not in a recognized version string format"); } return Integer.parseInt(m.group(1)); } /** * Version check for use with the {@link JDK_VERSION} annotation. */ public static boolean thisVersionOrNewer(JDK_VERSION version) { if (version == null) { return true; } return JDK_VERSION >= jdkVersionValue(version.value()); } }