关于反思包的问题

时间:2011-03-15 11:25:38

标签: java reflection

我从sun网站上读到,每个引用jvm都会创建一个不可变的类对象   这样它就可以反省每个班级的运行时间信息。 sun提到使用.class语法。我想知道这种语法的内部机制及其工作原理。

3 个答案:

答案 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获取其类对象。

从类对象中,您可以检查您的类,获取构造函数,方法,字段,超类,实现的接口等等 - 这称为反射。

(有关详细信息,请参阅其他答案中的链接。)