sigh
第一次看到这种问题,我还没有遇到过……
你怎么试出来的?牛
关注中

解决方案 »

  1.   

    呵呵,在java中每一个类都对应一个Class的类,该Class类为一个表述类的类(说起来有点别扭哦),具体Class类就是描述一个类结构的类,该类有什么方法,有什么属性之类的,你可以通过看JavaDoc中的Class类就知道它是什么了。很多场合,我们可以根据这个Class类来实例化一个该类的对象,通常可以通过Class.newInstance,还记得JDBC中有一个Class.forName()方法吗?它其实就是通过字符串加载一个类,然后返回该类的Class类。而每一类都有一个属性.class就是返回该类的Class类对象。这样就可以很直接的找到Class对象,而不用通过Class.forName()或其他方法了。记住,Class类为描述具体某一个类的描述类。
      

  2.   

    //----------------------------------------------------
    现在假设我们有一个类叫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。
      

  3.   

    这个东东用处太大,如果你要是写javabean组件的话,你就要天天和他打交道的。
    同时我们使用JNI进行混合语言编程的时候,使用也很多的。我们可以通过Class类的实例完成我们所有想完成的事情。生成类的实例,取得类的变量,引用类的方法。你看的真是很仔细的,不过你要是有兴趣的,可以仔细研究一下EJB中IIOP使用情况。实际上EJB实现的细节中采用了类似COM 的实现技术,所以EJB里面用Class的一些功能来实现Home和Remote接口实现类对EJB完成类功能的引用。看了之后,哈哈,你几乎觉得EJB只是COM的一个翻版,不过SUN做的还是真的不错的说。
      

  4.   

    谢谢:
    gfzhx(小小) :
       也就是说MyClass.class得到的是一个Class实例了!
       MyClass.class.newInstance();等价于new MyClass()?  class看上去好像是MyClass的一个静态属性?从object得来的吗?
      好像Object 没有定义!这到底对不对?to : zosatapo(隆杰@宗山太保) :
      正在研究中 ...
      

  5.   

    让我们先看一看这两个程序的结果: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到底是什么处理的!
      

  6.   

    问题1、3基本解决!多谢zosatapo(隆杰@宗山太保)     Test t=new Test();
         Class cls=t.getClass();
         但是我们如果需要的话,也可以象下面那样写:
         Class cls=Test.class;
         上面两个写法等价而且效果一样。但是在api中找不到Test.class的实现!
    那么说这是不是由虚拟机来实现的了?对不对?
      

  7.   

    我觉得EJB地实现和COM差异很大的,他们的共同点只是分布式带来的,所以我觉得不能说EJB是COM的翻版:)
      

  8.   

    qiyao(享受每一天) :
      这好像看不出来吧!
      
      第一段代码是调用了其基类Object的toString();
      但第二段还是不知说云,Object 没实现class;Test.class既不是对应文件Test.class
    又不是属性、方法,
    他到底是什么?
    郁闷!
      

  9.   

    Dickensi(流星·逐日)
    MyClass.class.newInstance();等价于new MyClass(),可以这么说吧,但这种情况不是用在这种场合,很多时候是用在动态创建类(不能直接new对象的时候)。当你只知道一个类的类名时,怎样动态的创建类对象,就只能靠这种方式了。     Test t=new Test();
         Class cls=t.getClass();
         但是我们如果需要的话,也可以象下面那样写:
         Class cls=Test.class;   (只能是类才有这种写法,对象就不能了)
         上面两个写法等价而且效果一样。
    ---------------------------------------------
    上面两方法效果一样,但是用的场合不一样,一个是通过对象得到Class,一个是类似于静态的方法得到。Test.class,我觉得应该是由编译器或是虚拟机得到的。
      

  10.   

    让我们先看一看这两个程序的结果:public class TestField1 {
     public static void main(String args[]){
    System.out.println(new TestField1());
    }       
    }
    结果:TestField1@310d42
    任何new 一个对象,它的全过程、管理,由JVM处理。
    而,
      

  11.   

    public class TestField1 {
     public static void main(String args[]){
    System.out.println(TestField1.class);
    }  
    }
    其中TestField1.class返回的一个Class 
    如同:Object obj
     Class newClass=obj.getClass
      

  12.   

    只要记住类.class返回一个该类的Class对象。从对象中也可以通过.getClass()返回该对象对应的类的Class对象。类和对象是两码事。
      

  13.   

    恍然大悟!明白!
    MyClass.class 差不多等价于
     MyClass.getClass();不过Object中的getClass不是static的,
    大概就是这样吧!
    谢了!
      

  14.   

    明白你的意思!不过我觉得都是在编码期确定的,Class.forName()才是在运行期得到,
    否则在没声明MyClass的情况下
    Class cls = MyClass.class;
    应当能编译通过的!
    只不过处理异常!MyClass.class与 new MyClass().getClass();
    的区别就是生成与不生成一个实例的区别巴!
      

  15.   

    MyClass.class.getName();
    the method declared the object.
      

  16.   

    我觉得两个都是在编码期确定的!
    否则在没声明MyClass的时候这句:
    MyClass.class;应当能编译通过!
    只不过要处理异常!Class.forName().newInstance();
    应该才是运行期得到的吧!我还是不懂MyClass.class到底在那些地方使用合适?
    只是为了少生成一个对象实例吗?能举个有说服性的例子吗?
      

  17.   

    这里有一个例子,可帮你理解。
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.rmi.PortableRemoteObject;
    import java.math.BigDecimal;public class ConverterClient {   public static void main(String[] args) {
           try {
               Context initial = new InitialContext();
               Context myEnv = (Context)initial.lookup("java:comp/env");
               Object objref = myEnv.lookup("ejb/SimpleConverter");           ConverterHome home = 
                   (ConverterHome)PortableRemoteObject.narrow(objref, 
                                                ConverterHome.class);//注意这里.           Converter currencyConverter = home.create();           BigDecimal param = new BigDecimal ("100.00");
               BigDecimal amount = currencyConverter.dollarToYen(param);
               System.out.println(amount);
               amount = currencyConverter.yenToEuro(param);
               System.out.println(amount);           System.exit(0);       } catch (Exception ex) {
               System.err.println("Caught an unexpected exception!");
               ex.printStackTrace();
           }
       } 
    } Could you catch it...
      

  18.   

    Dickensi(流星·逐日)
    当然不是了,如果你的类是一个抽象类abstract,你能生成对象实例吗?很多情况下我们是不用生成对象就得到Class了,何必再去生成对象呢?这两种方法理解了,就能很灵活的使用了,如果有对象就从对象得到,如果是很确定的就直接可以Test.class了。
      

  19.   

    java thihking 这本书上rtti这一章上有讲过
      

  20.   

    /* 恍然大悟!明白!
       MyClass.class 差不多等价于
       MyClass.getClass();   不过Object中的getClass不是static的,
       大概就是这样吧!
    */
      如果MyClass是一个类,那么
      MyClass.class 正确;
      MyClass.getClass()错误,正确写法是
             MyClass cla = new MyClass();
             Class ccc = cla.getClass;   :)
                                       
      

  21.   

    今天结账:
     谁能解释这几句森么意思:
    Context initial = new InitialContext();
    Context myEnv = (Context)initial.lookup("java:comp/env");
    Object objref = myEnv.lookup("ejb/SimpleConverter");
    ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objref, ConverterHome.class);//这句到底什么意思.就是验证objref 是否匹配ConverterHome类型,并强制转换吗?
    Object objref = myEnv.lookup("ejb/SimpleConverter");
    这句正常的话返回的真正类型就是一个ConverterHome对象?
    对不对?
      

  22.   

    你的理解完全正确,你可以把objref直接强制类型转换成ConverterHome。你试一试看!