日期:2011-03-22 16:17:00 来源:本站整理
java的rtti中class对象[Java编程]
本文“java的rtti中class对象[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
为理解RTTI在Java里若何工作,首先必须理解范例信息在运行期是若何表示的.这时要用到一个名为“Class对象”的特别情势的对象,此中包含了与类有关的信息(有时也把它叫作“元类”).事实上,我们要用Class对象成立属于某个类的全部“通例”或“普通”对象.
关于作为程序一部份的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会成立一个Class对象(更恰本地说,是保存在一个完好同名的.class文件中).在运行期,一旦我们想生成那个类的一个对象,用于执路程序的Java虚拟机(JVM)首先就会查抄那个范例的Class对象能否已经载入.若还没有载入,JVM就会查找同名的.class文件,并将其载入.所以Java程序启动时并非完好载入的,这一点与很多传统语言都差别.
一旦那个范例的Class对象进入内存,就用它成立那一范例的全部对象.
若这种说法多少让你产生了一点儿迷惑,大概并没有真正理解它,下面这个示范程序大概能供应进一步的帮忙:
对每个类来说(Candy,Gum和Cookie),它们都有一个static从句,用于在类初次载入时履行.呼应的信息会打印出来,奉告我们载入是什么时刻举行的.在main()中,对象的成立代码位于打印语句之间,以便侦测载入时间.//: SweetShop.java // Examination of the way the class loader works class Candy { static { System.out.println("Loading Candy"); } } class Gum { static { System.out.println("Loading Gum"); } } class Cookie { static { System.out.println("Loading Cookie"); } } public class SweetShop { public static void main(String[] args) { System.out.println("inside main"); new Candy(); System.out.println("After creating Candy"); try { Class.forName("Gum"); } catch(ClassNotFoundException e) { e.printStackTrace(); } System.out.println( "After Class.forName(\"Gum\")"); new Cookie(); System.out.println("After creating Cookie"); } } ///:~
分外风趣的一行是:
Class.forName("Gum");
该办法是Class(即全部Class所从属的)的一个static成员.而Class对象和其他任何对象都是近似的,所以可以获得和掌握它的一个句柄(装载模块就是干这件事的).为得到Class的一个句柄,一个办法是利用forName().它的作用是获得包含了目标类文本名字的一个String(注意拼写和大小写).最后返回的是一个Class句柄.
该程序在某个JVM中的输出以下:
可以看到,每个Class只有在它需求的时刻才会载入,而static初始化工作是在类载入时履行的.inside main Loading Candy After creating Candy Loading Gum After Class.forName("Gum") Loading Cookie After creating Cookie
非常风趣的是,另一个JVM的输出变成了另一个模样:
看来JVM通过查抄main()中的代码,已经猜测到了对Candy和Cookie的需求,但却看不到Gum,因为它是通过对forName()的一个调用成立的,而不是通过更典型的new调用.固然这个JVM也到达了我们但愿的效果,因为确切会在我们需求之前载入那些类,但却不能必定这儿展示的行为百分之百精确.Loading Candy Loading Cookie inside main After creating Candy Loading Gum After Class.forName("Gum") After creating Cookie
1. 类标志
在Java 1.1中,可以采取第二种方法来产生Class对象的句柄:利用“类标志”.对上述程序来说,看起来就象下面这样:
Gum.class;
这样做不但越发简单,并且更安全,因为它会在编译期间得到查抄.由于它撤消了对办法调用的需求,所以履行的效率也会更高.
类标志不但可以利用于普通类,也可以利用于接口、数组以及基本数据范例.除此以外,针对每种基本数据范例的封装器类,它还存在一个名为TYPE的尺度字段.TYPE字段的作用是为相关的基本数据范例产生Class对象的一个句柄,以下所示:
……等价于……
... is equivalent to ... |
|
---|---|
boolean.class |
Boolean.TYPE |
char.class |
Character.TYPE |
byte.class |
Byte.TYPE |
short.class |
Short.TYPE |
int.class |
Integer.TYPE |
long.class |
Long.TYPE |
float.class |
Float.TYPE |
double.class |
Double.TYPE |
void.class |
Void.TYPE |
以上是“java的rtti中class对象[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论