当前位置:编程学习 > JAVA >>

Java Reflection教程(2):Classes类定义

使用Java Reflection (有翻译成反射的)API可以在程序运行时动态查询类的定义,查询类的定义是使用Java Reflection API 所要作的第一件事.

也就是说所有反射操作的入口点为java.lang.Class 类。有下面几种方法可以取得某个数据类型对应的Class类:

Object.getClass()

当可以访问一个类型的实例对象时,一个简单的方法使用通过Object.getClass() 来取得该对象的类型定义,如下例可以取得String的类定义:

[java] Class c = "foo".getClass(); 
Class c = "foo".getClass();

 

使用 .class

如果已知某个类的类型,可以直接使用.class 来取的类的定义,这也是用来取的基本数据类型(如boolean,int等)的方法。

[java]
boolean b; 
Class c = b.getClass();   // compile-time error  
  
Class c = boolean.class;  // correct 
boolean b;
Class c = b.getClass();   // compile-time error
 
Class c = boolean.class;  // correct

 

注: 不能使用b.getClass() 来取的boolean 的类型定义,这是因为基本数据类型无法dereferenced.

Class.forName()

如果知道类的全名称,可以使用Class.forName() 来取得该类的类定义。如:

[java]
Class c = Class.forName("com.duke.MyLocaleServiceProvider"); 
Class c = Class.forName("com.duke.MyLocaleServiceProvider");

取的对应的数组类型的类型定义可以使用”[".

[java]
Class cDoubleArray = Class.forName("[D"); 
  
Class cStringArray = Class.forName("[[Ljava.lang.String;"); 
Class cDoubleArray = Class.forName("[D");
 
Class cStringArray = Class.forName("[[Ljava.lang.String;");
TYPE 域

对应基本数据类型,除了使用.class 方法外,还可以使用其对应的Type 成员。如:

[java]
Class c = Double.TYPE; 
Class v = Void.TYPE; 
Class c = Double.TYPE;
Class v = Void.TYPE;
有了类对应的Class 定义之后,可以获取类的:

Class Name 类名称
Class Modifies (public ,private ,synchronized etc) 类修饰符
Package Info 类所在包的信息。
Superclass 父类定义
Implemented Interfaces 类实现的接口定义
Constructors 类构造函数定义
Methods 类方法定义
Fields 类成员变量定义
Annotations 类标注定义
1. 获取Class名称

取得Class的全名

[java]
Class aClass = ... //obtain Class object. See prev. sectionString className = aClass.getName(); 
Class aClass = ... //obtain Class object. See prev. sectionString className = aClass.getName();
如果不需要package ,只要Class名称,可以使用getSimpleName

[java]
Class  aClass          = ... //obtain Class object. See prev. section  
String simpleClassName = aClass.getSimpleName(); 
Class  aClass          = ... //obtain Class object. See prev. section
String simpleClassName = aClass.getSimpleName();
2. 获取类修饰符 www.zzzyk.com

类可以使用public ,private ,static 加以修饰,getModifiers()可以用来获取类修饰符定义。

[java]
Class  aClass = ... //obtain Class object. See prev. section  
int modifiers = aClass.getModifiers(); 
Class  aClass = ... //obtain Class object. See prev. section
int modifiers = aClass.getModifiers();
根据getModifiers() 的返回值,可以使用Modifier.ixXXX 来判断修饰符类型:


[java]
Modifier.isAbstract(int modifiers) 
Modifier.isFinal(int modifiers) 
Modifier.isInterface(int modifiers) 
Modifier.isNative(int modifiers) 
Modifier.isPrivate(int modifiers) 
Modifier.isProtected(int modifiers) 
Modifier.isPublic(int modifiers) 
Modifier.isStatic(int modifiers) 
Modifier.isStrict(int modifiers) 
Modifier.isSynchronized(int modifiers) 
Modifier.isTransient(int modifiers) 
Modifier.isVolatile(int modifiers) 
Modifier.isAbstract(int modifiers)
Modifier.isFinal(int modifiers)
Modifier.isInterface(int modifiers)
Modifier.isNative(int modifiers)
Modifier.isPrivate(int modifiers)
Modifier.isProtected(int modifiers)
Modifier.isPublic(int modifiers)
Modifier.isStatic(int modifiers)
Modifier.isStrict(int modifiers)
Modifier.isSynchronized(int modifiers)
Modifier.isTransient(int modifiers)
Modifier.isVolatile(int modifiers)

 3. 获取类所在包的信息

 

[java]
Class  aClass = ... //obtain Class object. See prev. section  
Package package = aClass.getPackage(); 
Class  aClass = ... //obtain Class object. See prev. section
Package package = aClass.getPackage();

 

通过Package 可以得到包的名称等信息。

4. 获取父类定义

[java]
Class superclass = aClass.getSuperclass(); 
Class superclass = aClass.getSuperclass();
superclass 也是Class类型,使用可以再使用Class的方法来访问父类的定义。

5. 获取类实现的接口定义

[java]
Class  aClass = ... //obtain Class object. See prev. section  
Class[] interfaces = aClass.getInterfaces(); 
Class  aClass = ... //obtain Class object. See prev. section
Class[] interfaces = aClass.getInterfaces();

 

类可以实现多个接口,要注意的是,这个方法只返回该类直接定义的接口类型,不返回父类实现的接口类型。

6. 获取构造函数


 

[java]
Constructor[] constructors = aClass.getConstructors(); 
Constructor[] constructors = aClass.getConstructors();
7. 获取类的方法定义


 

[java]
Method[] method = aClass.getMethods(); 
Method[] method = aClass.getMethods();

 8. 获取类的成员定义

 

 

[java]
Method[] method = aClass.getFields(); 
Method[] method = aClass.getFields();
9. 获取类的标注信息


 

[java]
Annotation[] annotations = aClass.getAnnotations(); 
Annotation[] annotations = aClass.getAnnotations();

 

 

摘自 引路蜂移动软件

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,