how to get the constant pool for a class

获取类的常量池:

 

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

 

 

 

 

 

猜你喜欢

转载自lobin.iteye.com/blog/2324643
今日推荐