我从sun网站上读到,每个引用jvm都会创建一个不可变的类对象 这样它就可以反省每个班级的运行时间信息。 sun提到使用.class语法。我想知道这种语法的内部机制及其工作原理。
答案 0 :(得分:1)
您可能希望从the reflection tutorial
开始解释了.class
语法on this page(不,它没有解释内部工作原理)
答案 1 :(得分:1)
如果使用-target 1.4
或更早版本进行编译,则会调用Class.forName(String)
一次,然后将Class
引用存储在调用类的合成静态字段中。对于-target 1.5
及更高版本,新版本的ldc
(“加载常量”)字节码操作引用该类。
使用javap -c
查看javac生成的字节码。
答案 2 :(得分:0)
对于每个非泛型(或原始)类型(类,接口,数组类型,基本类型),都会在加载此类时创建一个Class对象。该对象不是完全不可变的,因为它包含类的静态变量,例如。
如果您有一个对象,则可以通过调用o.getClass()
来获取其实现类的类对象。如果您有某种类型,则可以通过Java中的T.class
获取其类对象。
从类对象中,您可以检查您的类,获取构造函数,方法,字段,超类,实现的接口等等 - 这称为反射。
(有关详细信息,请参阅其他答案中的链接。)