Java 反射

来源:互联网 发布:沃尔沃如何安装软件 编辑:程序博客网 时间:2024/04/30 00:02

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
原创粉丝点击