获取类的常量池:
ConstantPool constantPool = sun.misc.SharedSecrets.getJavaLangAccess().getConstantPool(Class klass);
例如:
ConstantPool constantPool = sun.misc.SharedSecrets.getJavaLangAccess().getConstantPool(String.class);
在SharedSecrets类(sun.misc.SharedSecrets)中, SharedSecrets.java在jdk\src\share\classes\sun\misc目录下,其中有个getJavaLangAccess和setJavaNetAccess方法:
public static JavaLangAccess getJavaLangAccess() {
return javaLangAccess;
}
public static void setJavaNetAccess(JavaNetAccess jna) {
javaNetAccess = jna;
}
在System类(java.lang.System)中,在jdk\src\share\classes\java\lang下,气宗有个initializeSystemClass方法,该方法由JVM调用,其中有如下代码:
// Allow privileged classes outside of java.lang
sun.misc.SharedSecrets.setJavaLangAccess(new sun.misc.JavaLangAccess(){
public sun.reflect.ConstantPool getConstantPool(Class klass) {
return klass.getConstantPool();
}
public boolean casAnnotationType(Class<?> klass, AnnotationType oldType, AnnotationType newType) {
return klass.casAnnotationType(oldType, newType);
}
public AnnotationType getAnnotationType(Class klass) {
return klass.getAnnotationType();
}
public byte[] getRawClassAnnotations(Class<?> klass) {
return klass.getRawAnnotations();
}
public <E extends Enum<E>>
E[] getEnumConstantsShared(Class<E> klass) {
return klass.getEnumConstantsShared();
}
public void blockedOn(Thread t, Interruptible b) {
t.blockedOn(b);
}
public Thread newThreadWithAcc(Runnable target, AccessControlContext acc) {
return new Thread(target, acc);
}
});
ConstantPool
sun.reflect.ConstantPool类在jdk\src\share\classes\sun\reflect目录下。ConstantPool 类通过反射方式来访问类对应的常量池。
public class ConstantPoolClass {
}
16
0: fail: Wrong type at constant pool index
1: getClassAt: class com.alaemall.ConstantPoolClass
2: getUTF8At: com/alaemall/ConstantPoolClass
3: getClassAt: class java.lang.Object
4: getUTF8At: java/lang/Object
5: getUTF8At: <init>
6: getUTF8At: ()V
7: getUTF8At: Code
8: getMethodAt: public java.lang.Object()
9: fail: Wrong type at constant pool index
10: getUTF8At: LineNumberTable
11: getUTF8At: LocalVariableTable
12: getUTF8At: this
13: getUTF8At: Lcom/alaemall/ConstantPoolClass;
14: getUTF8At: SourceFile
15: getUTF8At: ConstantPoolClass.java