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

本文深入探讨了Java反射API的使用方法,包括如何获取类的定义、类的修饰符、所在包信息、父类定义、接口定义、构造函数、方法、成员变量以及标注信息。同时,展示了获取类全名、类修饰符、类所在包信息、父类定义、类实现的接口定义、构造函数、类的方法、类的成员变量和类的标注信息的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

Object.getClass()

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

Class c = "foo".getClass();


使用 .class

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

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


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

Class.forName()

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

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


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

Class cDoubleArray = Class.forName("[D");
 
Class cStringArray = Class.forName("[[Ljava.lang.String;");

TYPE 域

对应基本数据类型,除了使用.class 方法外,还可以使用其对应的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的全名

Class aClass = ... //obtain Class object. See prev. sectionString className = aClass.getName();

如果不需要package ,只要Class名称,可以使用getSimpleName

Class  aClass          = ... //obtain Class object. See prev. section
String simpleClassName = aClass.getSimpleName();

2. 获取类修饰符

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

Class  aClass = ... //obtain Class object. See prev. section
int modifiers = aClass.getModifiers();

根据getModifiers() 的返回值,可以使用Modifier.ixXXX 来判断修饰符类型:


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. 获取类所在包的信息

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


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

4. 获取父类定义

Class superclass = aClass.getSuperclass();

superclass 也是Class类型,使用可以再使用Class的方法来访问父类的定义。

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

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


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

6. 获取构造函数


Constructor[] constructors = aClass.getConstructors();

7. 获取类的方法定义


Method[] method = aClass.getMethods();


8. 获取类的成员定义

Method[] method = aClass.getFields();

9. 获取类的标注信息


Annotation[] annotations = aClass.getAnnotations();





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值