浏览 1570 次
锁定老帖子 主题:Classes
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-14   最后修改:2009-05-14
对于每一个类型对象,java虚拟机都会实例一个不变的java.lang.Class的对象,用来提供运行时的信息检查.Class也提供了创建新的classes和对象的能力.更重要的是它是映射API的一个入口点.
在java.lang.reflect包下所有的类以及java.lang.reflect.ReflectPermission(当然它也是类),都没有一个公共的构造子.为了获取这些类的对象,Class类提供了相应的方法.所以我们说它是映射API的一个入口,正是基于此.

这里有几种方法来获取一个Class
Object.getClass()
如果一个对象实例可用,那么一个最简单的方法去获取它的Class就是去调用Object.getClass().当然这仅仅适合于继承至java.lang.Object引用类型.如
Class c = "foo".getClass();
再如获取虚拟机控制台的Class
Class c = System.console().getClass();
因为数组也是对象,所以可以对一个数组实例调用getClass()基本数据类型数组其Class分别是[C , [I, [S, [B等.
byte[] bytes = new byte[1024];
Class c = bytes.getClass();
枚举类型中A为E的一个实例所以返回的Class是类型E的Class
enum E { A, B }
Class c = A.getClass();
java.util.Set是java.util.HashSet的一个接口,用getClass()返回的值是java.util.HashSet
import java.util.HashSet;
import java.util.Set;

Set<String> s = new HashSet<String>();
Class c = s.getClass();

.class 语法
如果一个类型可用,但是没有实例,此时可以用类型名加".class"来获取Class,这也是最简单的方法去获取基本数据类型的Class如下 :
boolean b;
Class c = b.getClass();   // compile-time error

Class c = boolean.class;  // correct
注意基本数据类型不是引用型的所以上一种会发生编译时错误.
Class c = java.io.PrintStream.class;
Class的变量c与类型java.io.PrintStream对应.
Class c = int[][][].class;
对多维数组也可以获取其Class

Class.forName()
如果一个类的完整名可用,可以使用Class的一个静态方法Class.forName()来获取对应的Class.不能用于基本数据类型.
如:
Class c = Class.forName("com.duke.MyLocaleServiceProvider");
这段语句会根据给定的全名来产生class
CLass cDoubleArray = Class.forName("[D");
获取double类型数组的Class,等同double[].class
Class cStringArray = Class.forName("[[Ljava.lang.String;");
获取二维String类型的class

适用于基本数据类型打包类的TYPE字段.
当然对于基本数据类型. class是一个更好的方法,但是也有一个另外的方法.在java.lang包下每一个基本数据类型以及void有一个打包类,它们用于对基本类型装箱到引用类型.每一个打包类包含一个叫作TYPE的字段等同于被打包的基本数据类型的Class.如:
Class c = Double.TYPE;
等同于
Class c = double.class;

间接返回Classes的方法
这里有几个获取classes的反射API,但是仅仅当有一个Class被获取后.如:
返回一个被给类的超类 Class.getSuperclass():
Class c = javax.swing.JButton.class.getSuperclass();
也就是先获取到javax.swing.JButton的Class然后在获取其父类的Class
Class.getClasses()返回指定类所有的公开的类,接口,以及枚举类型包括被继承的成员.
如:
Class<?>[] c = Character.class.getClasses();
Character包含两个成员类Character.Subset , Character.UnicodeBlock.
Class.getDeclaredClasses() :返回所有明确申明在这个类中的所有的类,接口,枚举,
如:Class<?>[] c = Character.class.getDeclaredClasses();
Character包含两个公共的成员类Character.Subset , Character.UnicodeBlock 和一个私有的Character.CharacterCache
可有的形式:
{ Class, java.lang.reflect. { Field, Method, Constructor } }.getDeclaringClass()
如:
import java.lang.reflect.Field;

Field f = System.class.getField("out");
Class c = f.getDeclaringClass();
得到System类型
Class.getEnclosingClass():返回这个类的直接的外部类
如:
Class c = Thread.State.class.getEnclosingClass();
返回State的外部类Thread





论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics