Java 反射

Java Reflection

Java 反射(Reflection)是一种在运行时无需知道类名和方法名,就能检查类,接口,变量以及方法的机制。在编译时,反射机制可以实例化对象,调用方法,以及 Get/Set属性变量。
+ 反射用例

Method[] methods = MyObject.class.getMethods();
for (Method method : methods) {
  System.out.println("method name = " + method.getName());
}

这个例子从MyObject类获取了类对象,使用这个类对象获取了MyObject类所有的方法数组,并遍历这些方法的名称。

类 Classes

使用Java 反射的第一步通常是在运行时检索Java类,通常对于Java类可以获取的信息包括:

  • 类名 Class Name
  • 类修饰符 Class Modifiers(public, private, synchronized etc.)
  • 包信息 Package Info
  • 超类 Superclass
  • 实现的接口 Implemented Interfaces
  • 构造方法 Constructors
  • 方法 Methods
  • 属性变量(域) Fields
  • 注解 Annotations

类对象 Class Object

在检查类之前,通常需要获取去它的java.lang.Class对象,Java中所有的类包含这个基础类型。
在编译时如果知道一个类的名称,我们可以通过如下方式获取类对象:
Class myObjectClass = MyObject.class;
编译时如果不知道类的名称,但是在运行时知道类名的字符串(class name as a string),可以通过如下方式获取类对象:

String className = ...;// 运行时获取的类名字符串
Class class = Class.forName(className);

Class.forName()方法在 classpath 未发现类时抛出ClassNotFoundException异常。

类名 Class Name

通过类对象获取类名有两种方式:

Class class = ...; // 类对象
String className = class.getName(); // 类完整的名称
String simpleClassName = class.getSimpleName(); // 类的简单名称 e.g. psfs TAG = MainActivity.class.getSimpleName();

修饰符 Modifiers

通过类对象获取类修饰符:

Class class = ...;
int modifiers = class.getModifiers();

修饰符被包装成 int 类型,每个修饰符是一个标识位(flag bit),每个被设置或清除。可以通过java.lang.reflect.Modifier类检索这些修饰符:

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)

包信息 Package Info

通过类对象获取包信息:

Class class = ...;
Package package = class.getPackage();

包对象还有很多信息,如包的version number,参见:Package

超类 Superclass

通过类对象获取超类:
Class superclass = class.getSuperclass();

实现的接口 Implemented Interfaces

通用类对象获取类所实现的接口:

Class class = // 类对象
Class[] interfaces = class.getInterfaces();

类可以实现多个接口,Java反射使用Class表示接口的类型。注意返回的接口数组仅包含当前类所实现的接口,不包含当前类的超类所实现的接口。

构造方法 Constructors

通过类对象获取类的构造方法:
Constructor[] constructors = class.getConstructors();

方法 Methods

通过类对象获取类的方法:
Method[] method = class.getMethods();

属性变量(域) Fields

通过类对象获取域的方法:
Field[] fields = class.getFields();

注解 Annotations

通过类对象获取注解的方法:
Annotations[] annotations = class.getAnnotations();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值