让我们先看一看这两个程序的结果: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到底是什么处理的!
问题1、3基本解决!多谢zosatapo(隆杰@宗山太保) Test t=new Test(); Class cls=t.getClass(); 但是我们如果需要的话,也可以象下面那样写: Class cls=Test.class; 上面两个写法等价而且效果一样。但是在api中找不到Test.class的实现! 那么说这是不是由虚拟机来实现的了?对不对?
Dickensi(流星·逐日) MyClass.class.newInstance();等价于new MyClass(),可以这么说吧,但这种情况不是用在这种场合,很多时候是用在动态创建类(不能直接new对象的时候)。当你只知道一个类的类名时,怎样动态的创建类对象,就只能靠这种方式了。 Test t=new Test(); Class cls=t.getClass(); 但是我们如果需要的话,也可以象下面那样写: Class cls=Test.class; (只能是类才有这种写法,对象就不能了) 上面两个写法等价而且效果一样。 --------------------------------------------- 上面两方法效果一样,但是用的场合不一样,一个是通过对象得到Class,一个是类似于静态的方法得到。Test.class,我觉得应该是由编译器或是虚拟机得到的。
让我们先看一看这两个程序的结果:public class TestField1 { public static void main(String args[]){ System.out.println(new TestField1()); } } 结果:TestField1@310d42 任何new 一个对象,它的全过程、管理,由JVM处理。 而,
public class TestField1 { public static void main(String args[]){ System.out.println(TestField1.class); } } 其中TestField1.class返回的一个Class 如同:Object obj Class newClass=obj.getClass
现在假设我们有一个类叫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。
同时我们使用JNI进行混合语言编程的时候,使用也很多的。我们可以通过Class类的实例完成我们所有想完成的事情。生成类的实例,取得类的变量,引用类的方法。你看的真是很仔细的,不过你要是有兴趣的,可以仔细研究一下EJB中IIOP使用情况。实际上EJB实现的细节中采用了类似COM 的实现技术,所以EJB里面用Class的一些功能来实现Home和Remote接口实现类对EJB完成类功能的引用。看了之后,哈哈,你几乎觉得EJB只是COM的一个翻版,不过SUN做的还是真的不错的说。
gfzhx(小小) :
也就是说MyClass.class得到的是一个Class实例了!
MyClass.class.newInstance();等价于new MyClass()? class看上去好像是MyClass的一个静态属性?从object得来的吗?
好像Object 没有定义!这到底对不对?to : zosatapo(隆杰@宗山太保) :
正在研究中 ...
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到底是什么处理的!
Class cls=t.getClass();
但是我们如果需要的话,也可以象下面那样写:
Class cls=Test.class;
上面两个写法等价而且效果一样。但是在api中找不到Test.class的实现!
那么说这是不是由虚拟机来实现的了?对不对?
这好像看不出来吧!
第一段代码是调用了其基类Object的toString();
但第二段还是不知说云,Object 没实现class;Test.class既不是对应文件Test.class
又不是属性、方法,
他到底是什么?
郁闷!
MyClass.class.newInstance();等价于new MyClass(),可以这么说吧,但这种情况不是用在这种场合,很多时候是用在动态创建类(不能直接new对象的时候)。当你只知道一个类的类名时,怎样动态的创建类对象,就只能靠这种方式了。 Test t=new Test();
Class cls=t.getClass();
但是我们如果需要的话,也可以象下面那样写:
Class cls=Test.class; (只能是类才有这种写法,对象就不能了)
上面两个写法等价而且效果一样。
---------------------------------------------
上面两方法效果一样,但是用的场合不一样,一个是通过对象得到Class,一个是类似于静态的方法得到。Test.class,我觉得应该是由编译器或是虚拟机得到的。
public static void main(String args[]){
System.out.println(new TestField1());
}
}
结果:TestField1@310d42
任何new 一个对象,它的全过程、管理,由JVM处理。
而,
public static void main(String args[]){
System.out.println(TestField1.class);
}
}
其中TestField1.class返回的一个Class
如同:Object obj
Class newClass=obj.getClass
MyClass.class 差不多等价于
MyClass.getClass();不过Object中的getClass不是static的,
大概就是这样吧!
谢了!
否则在没声明MyClass的情况下
Class cls = MyClass.class;
应当能编译通过的!
只不过处理异常!MyClass.class与 new MyClass().getClass();
的区别就是生成与不生成一个实例的区别巴!
the method declared the object.
否则在没声明MyClass的时候这句:
MyClass.class;应当能编译通过!
只不过要处理异常!Class.forName().newInstance();
应该才是运行期得到的吧!我还是不懂MyClass.class到底在那些地方使用合适?
只是为了少生成一个对象实例吗?能举个有说服性的例子吗?
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...
当然不是了,如果你的类是一个抽象类abstract,你能生成对象实例吗?很多情况下我们是不用生成对象就得到Class了,何必再去生成对象呢?这两种方法理解了,就能很灵活的使用了,如果有对象就从对象得到,如果是很确定的就直接可以Test.class了。
MyClass.class 差不多等价于
MyClass.getClass(); 不过Object中的getClass不是static的,
大概就是这样吧!
*/
如果MyClass是一个类,那么
MyClass.class 正确;
MyClass.getClass()错误,正确写法是
MyClass cla = new MyClass();
Class ccc = cla.getClass; :)
谁能解释这几句森么意思:
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对象?
对不对?