当前位置: 技术问答>java相关
一个比较少见的基础问题!MyClass.class 到底编译器时怎样理解的?内详!
来源: 互联网 发布时间:2015-06-23
本文导语: 在很多场合有着中用法: class MyClass{ public void main(String[] args){ System.out.println(MyClass.class);//就是这里 } } 输出为:class MyClass 1,请问这句的MyClass.class什么意思?一个句并吗?还是一个实例? 2、My...
在很多场合有着中用法:
class MyClass{
public void main(String[] args){
System.out.println(MyClass.class);//就是这里
}
}
输出为:class MyClass
1,请问这句的MyClass.class什么意思?一个句并吗?还是一个实例?
2、MyClass.class到底是编译器处理还是JVM处理?
3、还有这个东西居然能系列化,句柄也能系列化吗?
我看到ejb客户端也用的了这玩艺,不知所云:
sessionBeanTestHome = (SessionBeanTestHome) PortableRemoteObject.narrow(ref, SessionBeanTestHome.class);
4、在那些场合下适合使用这种东西!?
问题很多,谢了先!
class MyClass{
public void main(String[] args){
System.out.println(MyClass.class);//就是这里
}
}
输出为:class MyClass
1,请问这句的MyClass.class什么意思?一个句并吗?还是一个实例?
2、MyClass.class到底是编译器处理还是JVM处理?
3、还有这个东西居然能系列化,句柄也能系列化吗?
我看到ejb客户端也用的了这玩艺,不知所云:
sessionBeanTestHome = (SessionBeanTestHome) PortableRemoteObject.narrow(ref, SessionBeanTestHome.class);
4、在那些场合下适合使用这种东西!?
问题很多,谢了先!
|
呵呵,在java中每一个类都对应一个Class的类,该Class类为一个表述类的类(说起来有点别扭哦),具体Class类就是描述一个类结构的类,该类有什么方法,有什么属性之类的,你可以通过看JavaDoc中的Class类就知道它是什么了。很多场合,我们可以根据这个Class类来实例化一个该类的对象,通常可以通过Class.newInstance,还记得JDBC中有一个Class.forName()方法吗?它其实就是通过字符串加载一个类,然后返回该类的Class类。
而每一类都有一个属性.class就是返回该类的Class类对象。这样就可以很直接的找到Class对象,而不用通过Class.forName()或其他方法了。
记住,Class类为描述具体某一个类的描述类。
而每一类都有一个属性.class就是返回该类的Class类对象。这样就可以很直接的找到Class对象,而不用通过Class.forName()或其他方法了。
记住,Class类为描述具体某一个类的描述类。
|
//----------------------------------------------------
现在假设我们有一个类叫Test,编译后文件Test.class.
一般情况下我们可以这样写:
Test t=new Test();
Class cls=t.getClass();
但是我们如果需要的话,也可以象下面那样写:
Class cls=Test.class;
上面两个写法等价而且效果一样。
不过使用的场合还是有一点不同的。
注意了,这里的Test.class可不是Test类编译后的文件名呀。
//------------------------------------------------------
现在解释一下到底发生了不得什么事情。
你要是使用过MFC的话,你的一定知道CRuntimeClass的东西。
在java中编译类也会自动生成一个跟类相关的类,那个类的一个
实例就是我们生成类的一个静态变量。就象上面的Test.class的
class.Class实例记录了Test类的一些信息,我们可以在类自检时候使用。
当然还有其他的一些场合了。
具体使用的话,就是如果我们只需要知道类的相关信息的话,我们就不需要
生成类的实例,就使用写法2,否则的话我们使用写法1。
现在假设我们有一个类叫Test,编译后文件Test.class.
一般情况下我们可以这样写:
Test t=new Test();
Class cls=t.getClass();
但是我们如果需要的话,也可以象下面那样写:
Class cls=Test.class;
上面两个写法等价而且效果一样。
不过使用的场合还是有一点不同的。
注意了,这里的Test.class可不是Test类编译后的文件名呀。
//------------------------------------------------------
现在解释一下到底发生了不得什么事情。
你要是使用过MFC的话,你的一定知道CRuntimeClass的东西。
在java中编译类也会自动生成一个跟类相关的类,那个类的一个
实例就是我们生成类的一个静态变量。就象上面的Test.class的
class.Class实例记录了Test类的一些信息,我们可以在类自检时候使用。
当然还有其他的一些场合了。
具体使用的话,就是如果我们只需要知道类的相关信息的话,我们就不需要
生成类的实例,就使用写法2,否则的话我们使用写法1。
|
让我们先看一看这两个程序的结果:
public class TestField1 {
public static void main(String args[]){
System.out.println(new TestField1());
}
}
结果:TestField1@310d42
。。。。。。。。。。。。。。。。。。
public class TestField1 {
public static void main(String args[]){
System.out.println(TestField1.class);
}
}
结果:class TestField1
很显MyClass.class到底是什么处理的!
public class TestField1 {
public static void main(String args[]){
System.out.println(new TestField1());
}
}
结果:TestField1@310d42
。。。。。。。。。。。。。。。。。。
public class TestField1 {
public static void main(String args[]){
System.out.println(TestField1.class);
}
}
结果:class TestField1
很显MyClass.class到底是什么处理的!
|
sigh
第一次看到这种问题,我还没有遇到过……
你怎么试出来的?牛
关注中
第一次看到这种问题,我还没有遇到过……
你怎么试出来的?牛
关注中
|
MyClass.class.getName();
the method declared the object.
the method declared the object.
|
/* 恍然大悟!明白!
MyClass.class 差不多等价于
MyClass.getClass();
不过Object中的getClass不是static的,
大概就是这样吧!
*/
如果MyClass是一个类,那么
MyClass.class 正确;
MyClass.getClass()错误,正确写法是
MyClass cla = new MyClass();
Class ccc = cla.getClass;
:)
MyClass.class 差不多等价于
MyClass.getClass();
不过Object中的getClass不是static的,
大概就是这样吧!
*/
如果MyClass是一个类,那么
MyClass.class 正确;
MyClass.getClass()错误,正确写法是
MyClass cla = new MyClass();
Class ccc = cla.getClass;
:)
|
MyClass.getClass();
|
java thihking 这本书上rtti这一章上有讲过