还剩5页未读,继续阅读
文本内容:
Java中Class类工作原理详解.txt不要为旧的悲哀而浪费新的眼泪!现在干什么事都要有经验的,除了老婆没有100分的另一半,惟独50分的两个人
1.Class对象Class对象包含了与类相关的信息事实上,Class对象就是用来创建类的所有的“普通”对象的类是程序的一部份,每一个类都有一个Class对象换言之,每当编写并且编译了一个新类,就会产生一个Class对象恰当地说,是被保存在一个同名的.class文件中在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机JVM首先检查这个类的Class对象是否已经加载如果尚未加载,JVM就会根据类名查找.class文件,并将其载入一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象看下面示例SweetShop.javapackage com.zj.sample;class Candy{static{System.out.printin,zLoading Candy;}class Gum{static{System,out.printinLoading Gum〃;}}class Cookie{static{System,out.printin,zLoading Cookie;}public classSweetShop{public staticvoid mainString[]args{System,out.printininside main;new Candy;System.out.println,,After creatingCandyz/;try{Class.forName^com.zj.sample.Gum〃;}catch ClassNotFoundExceptione{System.out.printin,,Couldn,t findGum;System,out.printin,zAfter Class.forName\〃Gum\〃〃;new Cookie;System,out.printin z,After creating Cookie;}结果inside mainLoadingCandyAfter creatingCandyLoading GumAfterClass.forName z,Gumz,Loading CookieAftercreatingCookie
2.获取Class实例的三种方式1利用对象调用getClass方法获取该对象的Class实例2使用Class类的静态方法forName,用类的名字获取一个Class实例3运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例
3.Class.forName上面的示例中Class.forName^com.zj.sample.Gum〃;这个方法是Class类所有Class对象都属于这个类的一个static成员Class对象就和其它对象一样,我们可以获取并操作它的引用forName是取得Class对象的引用的一种方法它是用一个包含目标类的文本名的String作输入参数,返回的是一个Class对象的引用
4.类字面常量Java还提供了另一种方法来生成对Class对象的引用,即使用“类字面常量”对上述程序来说,可以是com.zj.sample.Gum.class;
5.关键字instanceof关键字instanceof返回一个布尔值,判断是不是某个特定类型的实例if xinstanceof DogDogx.bark;
6.获取Class实例package com.zj.sample;class Point{int x,y;class ClassTest{public staticvoid mainString[]args{Point pt=new Point;Class cl=pt.getClass;System,out.printincl.getName;try{Class c2=Class.forName z,com.zj.sample.Point;System,out.printinc
2.getName;}catch Exceptione{e.printStackTrace;Class c3=Point,class;System,out.printinc
3.getName;Class c4=int.class;System,out.printlnc
4.getName;Class c5二Integer.TYPE;System.out.printlnc
5.getName;Class c6=Integer,class;System.out.printinc
6.getName;结果com.zj.sample.Pointcom.zj.sample.Pointcom.zj.sample.Pointintintjava.lang.Integer
7.Class的其他方法1Class.newTnstance使用所选的Class对象生成该类的新实例它调用了缺省无参数的类构造器生成新的对象所以使用newlnstance创建的类必须有一个缺省构造器对于newlnstance来说,可以在原先没有任何对象存在的情况下,使用它创建一个新的对象利用newlnstance实例化一个对象package com.zj.sample;class Point{static{System.out.printinLoading Point;}int x,y;class ClassTest{public staticvoid mainString[]args{try Classc=Class.forName z,com.zj.sample.Point;Point pt=Point c.newlnstance;}catch Exceptione{e.printStackTrace;结果Loading Point2Class,islnstance方法提供了一种动态地调用instanceof运算符的途径3Class,getlnterfaces方法返回Class对象的数组,这些对象代表的是某个Class对象所包含的接口4如果有一个Class对象,那末就可以通过getSuperclass获取它的直接基类这个方法自然也是返回一个Class引用,所以可以进一步查询其基类这意味着在运行时,可以找到一个对象完整的类层次结构5Class类支持反射的概念,Java附带的库java.lang,reflect包含了Field Method以及Constructor类每一个类都实现了Member接口这些类型的对象是由JVM在运行时创建的,用以表示未知类里对应的成员这样可以使用Constructor创建新的对象,用get和set方法读取和修改与Field对象关联的字段,用invoke方法调用与Method对象关联的方法此外,还可以调用getFieldsgetMethods getConstrucotrs方法,返回表示字段、方法以及构造器的对象的数组
8.利用反射API察看未知类的构造方法与方法package com.zj.sample;import java.lang,reflect.Constructor;import java.lang,reflect.Method;class Point{static{System.out.printinz,Loading Point;}int x,y;void output{System.out.printin z/x=z/+x+〃,〃+〃尸〃+y;Pointint x,int y{this.x=x;this.y=y;class ClassTest{public staticvoid mainString[]args{try Classc=Class.forName^com.zj.sample.Point;Constructor[]cons=c.getDeclaredConstructors;for inti=0;icons,length;i++//返回所有声明的构造方法System.out.printlncons[i];Method[]ms=c.getDeclaredMethods;for inti=0;ims.length;i++//返回所有声明的方法System,out.printin ms[i];}catch Exceptione{e.printStackTrace;结果Loading Pointcom.zj.sample.Pointint,intvoid com.zj.sample.Point,output
9.动态调用一个类的实例彻底没有浮现point这个名字package com.zj.sample;import java.lang.reflect.Constructor;import java.lang,reflect.Method;class Point{static{System,out.printIn^Loading Point;int x,y;void output{System.out.printin,,x=,/+x+〃,〃+〃y=〃+y;}Pointint x,int y{this,x=x;this.y=y;}class ClassTest{public staticvoid mainString[]args{try Classc=Class.forName^com.zj.sample.Point;Constructor[]cons=c.getDeclaredConstructors;Class[]params=cons
[0].getParameterTypes0;//察看构造器的参数信息Object[]paramValues=new Object[params,length];//构建数组传递参数for inti=0;iparams,length;i++{if params[i].isPrimitive//判断class对象表示是否是基本数据类型paramValues[i]=new Integeri;Object o=cons
[0].newlnstanceparamValues;//创建一个对象的实例Method[]ms=c.getDeclaredMethods;//调用方法ms
[0].invokeo,null;//用指定的参数调用output方法没有参数,null}catchException e{e.printStackTrace;结果Loading Pointx=0,y=l。