Java反射:Class 是java.lang 包中的类,Class的实例封装了和类有关的信息(即类型信息)。任何类默认有一个 public的静态的(static)Class 对象,该对象的名字是 class,该对象封装当前刻有关信息(即类型的信息),如该类有哪些构造方法、哪些成员变量、哪些方法等。也可以让类的对象调用 getClass()方法(从 java. lang. Object 类继承的方法)返回这个 Class对象:class。
class。Class 对象调用其方法可以获取当前类的有关信息,例如,类的名字、类中的方法
称、成员变量的名称等,这一机制也称为 Java 反射。
简单来说就是将类的各个组成部分封装为其他对象的过程就叫做反射,其中 组成部分 指的是我们类的 成员变量(Field)、构造方法(Constructor)、成员方法(Method)。
Class类的方法主要有一下几个:
• String getName()返回类的名字。
• Constructor[] getDeclaredConstructors()返回类的全部构造方法。
• Field[] getDeclaredFields()返回类的全部成员变量。
• Method[] getDeclaredMethods()返回类的全部方法。
举个例子:
//定义一个Rect类
public class Rect {
double width,height,area;
public Rect(){
}
public Rect(double w,double h){
width = w;
height = h;
}
public double getArea() {
area=height*width;
return area;
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public static void main(String args[]) {
Rect rect = new Rect();
Class cs = rect.getClass(); //或 Class cs = Rect.class;
System.out.println(cs == Rect.class); //输出结果是true
String className=cs.getName();
Constructor[] con=cs.getDeclaredConstructors(); //返回类中的构造方法
Field[] field=cs.getDeclaredFields() ; //返回类中的成员变量
Method[] method=cs.getDeclaredMethods(); //返回类中的方法
System.out.println("类的名字:"+className);
System.out.println("类中有如下的构造方法:");
for(int i=0;i<con.length;i++) {
System.out.println(con[i].toString());
}
System.out.println("类中有如下的成员变量:");
for(int i=0;i<field.length;i++) {
System.out.println(field[i].toString());
}
System.out.println("类中有如下的方法:");
for(int i=0;i<method.length;i++) {
System.out.println(method[i].toString());
}
}
}
反射的应用: 1,反编译,将 .class 文件转换为 .java 文件
2,spring的配置化
3,编译器的联想功能(如编译器的自动补全功能)
注意:反射在调用方法时会忽略权限检查,因此可以用反射方法调用一个类的私有方法。