反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性
通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
Java 反射主要提供以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
在运行时调用任意一个对象的方法
重点:是运行时而不是编译时
简单应用:
public class Book implements Parcelable{
private int id=1;
private String name="android";
private String author="wf";
private String getName(){
return name;
}
}
Book类中属性和方法都是私有的,现在我们通过反射来访问这些属性和方法。
String s = null;
try{
Class<?> bookClass = Class.forName("cc.abto.demo.Book");//完整类名
Object book = bookClass.newInstance();//获得实例
Method getAuthor = bookClass.getDeclaredMethod("getName");//获得私有方法
getAuthor.setAccessible(true);//调用方法前,设置访问标志
s = (String) getAuthor.invoke(book);//使用方法
}catch (Exception e)
e.printStackTrace();
}
可以看到上面代码中我们用Class和Method这两个类完成了反射,这两个类分别对应了类和方法,也就是包装了类和方法的信息,下面对反射的部分API做一下简单介绍:
Class类:代表一个类,位于java.lang包下
Field类:代表类的成员变量(成员变量也称为类的属性)
Method类:代表类的方法
Constructor类:代表类的构造方法
Array类:提供了动态创建数组,以及访问数组的元素的静态方法
网友评论