XX.class与 new XX().getClass()返回的是同一个东西。 看如下测试代码,它返回的是true public class TestClass { public TestClass() { } public static void main(String[] args) { TestClass t = new TestClass(); Object a,b; System.out.println(a=t.getClass()); System.out.println(b=TestClass.class); System.out.println(a.equals(b)); } }
这个对象描述了类xxx的信息.这么说应该清楚一些了.
看如下测试代码,它返回的是true
public class TestClass
{
public TestClass()
{
}
public static void main(String[] args)
{
TestClass t = new TestClass();
Object a,b;
System.out.println(a=t.getClass());
System.out.println(b=TestClass.class);
System.out.println(a.equals(b));
}
}
具体使用javap反编译一下代码就知道了
表示的是一个Class(类)的实例,当然是继承子Object而Object有一个toString()方法,也就是说所有的对象都可以用System.out.println(**),实际上就是System.out.println(***.class.toString)记住xxx.class是一个类实例就好了
Object.class是一样的。
ejb中经常用到
eg:
LocalProductHome home=(LocalProductHome)PortalbeRemoteObject.narrow(yourref,LocalProductHome.class);
不知是什么时候加进这个用法的,俺也没看见过正式声明过
什么是rtti? rtti是什么的缩写?
谢谢!
在java编写的每一个类中,生成的class中都包含了一个Class的类,保存有该类的信息。也称为ClassMeta类,原数据类。你可以想象系统中有这么一个原数据集合,可以用来在运行期来判定实际类型。Class类就是负责产生该类的实例的。产生的每一个实例,都包含有原数据类型的一个reference。所以class可以通过.class,实例可以通过getClass得到。java在程序启动的时候是不会装在全部的类的。当你要产生出一个实例的时候,java虚拟机会检查已经载入的类,如果有,就通过该Class产生一个新的实例,如果没有,就装载该类,然后在产生实例。java中RTTI的一个重要用途就是 安全的转型(downCast);大家都知道upcast是鼓励使用的一种机制,表现为多态。而在很多情况下面,我们不得不使用downCast,比如从容器中取出来的都是Object的,我们会将他们转化为需要的类型,如果与实际类型不符,就会抛出异常(系统级的)。
要全面了解RTTI,最好是从JAVA的reflection出发去全面掌握meta-class方面的知识。希望这些能给你一点帮助!
a.RTTI:at run-time ,the type of an object is identified.就是在运行期,可以识别对象的类型。
b.RTTI的历史渊源和基本理论如楼上所说。
c.java为支持RTTI,给出了三种使用 class对象的方式。
i.使用类java.lang.Class的方法:Class.forName(String className)
ii.使用对象的getClass方法。
iii.“using Java1.1 class literals" ,意思就是:程序代码的直接书写引用。
就是我们的Test.class的写法。
对于所有regular class,就是普通类,都可以这样用。对于基础类型,如boolean,int也可以这样使用。但对于包装类,如:Boolean,有特别说明,Boolean.class与boolean.class返回的是不同东西,因为他们本就不相同。但Boolean.TYPE可以引用到boolean.class。宗上所诉:Test.class的写法,是java 1.1开始的虚拟机的支持。不是从Object继承而来的。