当前位置:  技术问答>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、在那些场合下适合使用这种东西!?

问题很多,谢了先!



|
呵呵,在java中每一个类都对应一个Class的类,该Class类为一个表述类的类(说起来有点别扭哦),具体Class类就是描述一个类结构的类,该类有什么方法,有什么属性之类的,你可以通过看JavaDoc中的Class类就知道它是什么了。很多场合,我们可以根据这个Class类来实例化一个该类的对象,通常可以通过Class.newInstance,还记得JDBC中有一个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。

|
让我们先看一看这两个程序的结果:

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.

|
/* 恍然大悟!明白!
   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这一章上有讲过

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JAVA编译是不是比较慢呀??
  • 求教一个比较初级的java编译问题
  • 怎么安装一个比较“独立”的JAVA编译环境?
  • 哪个软件是开发JSP功能比较强的?(能够编译,指出出错语句)
  • 各位老鸟:你们是如何看待和对待java的反编译问题的,我感觉比较迷茫和困惑。
  • 【求助,这个比较难】关于编译.ko文件的问题。
  • 问个比较基础的问题 书上的一段demo ,编译不过呀
  • 我是初学者,问一个比较傻的问题:既然JAVA是一种纯面向对象的语言,那么为什么int i=new int()或int i=new int(1)不能通过编译?谢谢。
  • 代码比较长, 但是编译连接都通过了,就是结果不对。 希望各位帮帮忙, 时间紧急啊。老师要完成的作业
  • C++ Maps 成员 key_comp():返回比较元素key的函数
  • 你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。
  • C++ Maps 成员 value_comp():返回比较元素value的函数
  • 问一下,现在比较新比较好的MYSQL版本和JDBC版本
  • C++ MultiMaps 成员 key_comp():返回比较key的函数
  • SOCKET 比较是在比较什么 急
  • C++ MultiMaps 成员 value_comp():返回比较元素value的函数
  • 问一个比较简单的问题 frame 的 setSize()放在那里比较合适
  • C++ Double Ended Queues(双向队列) 成员 Operators:比较和赋值双向队列
  • 大家推荐一下有关LINUX7有关的网络编程的书。最好是比较全面的!比较经典的。
  • C++ Stacks(堆栈) 成员 操作:比较和分配堆栈
  • 用java读一个比较大的文本文件(几百k~几M)怎么才能比较快?
  • C++ Strings(字符串) 成员 Operators:操作符,用于字符串比较和赋值
  • "400分给有比较好的字符串比较的算法的朋友"要结帖,想做笔迹保留的不可漏看哦
  • C++ Strings(字符串) 成员 compare():比较两个字符串
  • arm-linux-gcc 在哪下载比较好,历史版本比较齐?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 问一个比较简单的问题 请不要见笑 frame 的 setVisible()放在那里比较合适?
  • C++ Bitsets 成员 Operators:比较和赋值bitsets
  • 在JSP中用session比较好?还是cookie比较好?因为什么?
  • STL vector+sort排序和multiset/multimap排序比较
  • 请大家帮忙推荐几款linux下比较好用的看jpeg图和看mpeg4比较好用的软件!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3