一、什么是反射(Reflection)?
简单的来讲就是可以从内存中直接获取到运行的class文件并且能够知道这个类的所有属性和方法;对于任意一个Java对象,都能够调用到它的任意一个方法或属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
用一句话来概括的话就是使用反射可以赋予jvm动态编译的能力。
二、反射能用来做什么?
反射可以做的事情实在是太多太多了,并且我们一般都是拿来主义,不会去重复的造轮子,所以有想要使用的框架直接拿过来就用,然后调用框架里面已经写好的方法就可以实现我们想要的业务功能了,那么作为一个框架来说咱们如何能做到通用呢,因为我们不能在框架里面去实现我们具体的业务代码,所以这个时候反射就派上用场了。
三、使用反射实现一个简单案例
我们创建一个java对象,然后动态执行对象里面的方法来给大家演示一下反射的执行过程。
1、创建一个简单的java工程
2、创建一个java类
package pojo;
import java.io.Serializable;
/**
* @Descrption 学生实体类
* @author lizhilun
*
*/
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;// 主键
private String name;// 姓名
private Integer age;// 年龄
// 公有方法
public void eat(String foodName) {
System.out.println(name + "吃" + foodName);
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Student(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Student() {
super();
}
}
3、创建一个反射工具类
package utils;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Descrption 反射工具类
* @author lizhilun
*
*/
public class ReflectionUtils implements Serializable{
private static final long serialVersionUID = 1L;
public static <T> void invoke(T t) throws Exception {
if(t!=null) {
Class<? extends Object> clasz = t.getClass();
Field[] fields = clasz.getFields();//获取所有的成员变量
for(Field f: fields) {
String name = f.getName();//获取字段名称
System.out.println("成员变量名称:》》》"+name);
}
Method[] methods = clasz.getMethods();//获取所有的公有方法
for (Method method : methods) {
String methodName = method.getName();//获取方法名称
System.out.println(methodName);
if(methodName!=null&&"eat".equals(methodName)) {
method.invoke(t, "蛋炒饭");//动态执行公有方法
}
}
}
}
}
4、创建一个测试类进行测试
package test;
import pojo.Student;
import utils.ReflectionUtils;
public class ReflectionTest {
public static void main(String[] args) {
Student student = new Student(1,"黄渤",30);//使用构造方法赋值
try {
ReflectionUtils.invoke(student);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样一个反射的简单应用就已经完成了,大家觉得简单吗?