一、什么是反射
反射首先是能够获取到Java中的反射类的字节码,然后将字节码中的方法,变量,构造函数等映射成 相应的 Method、Filed、Constructor 等类
二、反射的API
获取class字节码对象 的3 种方法
//第一种
Class studentClass = ;
//第二种
Student student = new Student();
Class studentClass1 = ();
//第三种 必须为全路径
Class studentClass2 = ("");
常用的一些API
获取包名 类名
().getName()//包名
()//类名
()//完整类名
获取成员变量定义信息
getFields()//获取所有公开的成员变量,包括继承变量
getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量
getField(变量名)
getDeclaredField(变量名)
获取构造方法定义信息
getConstructor(参数类型列表)//获取公开的构造方法
getConstructors()//获取所有的公开的构造方法
getDeclaredConstructors()//获取所有的构造方法,包括私有
getDeclaredConstructor(,)
获取方法定义信息
getMethods()//获取所有可见的方法,包括继承的方法
getMethod(方法名,参数类型列表)
getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法
getDeclaredMethod(方法名,,)
反射新建实例
();//执行无参构造创建对象
(666,”海绵宝宝”);//执行含参构造创建对象
(,)//获取构造方法
反射调用成员变量
(变量名);//获取变量
(true);//使私有成员允许访问
(实例,值);//为指定实例的变量赋值,静态变量,第一参数给null
(实例);//访问指定实例变量的值,静态变量,第一参数给null
反射调用成员方法
Method m = (方法名,参数类型列表);
(true);//使私有方法允许被调用
(实例,参数数据);//让指定实例来执行该方法
三、示例
首先定义一个类
@Data
@Builder
@Service
public class Student {
public String name;
private int age;
public char egx;
protected Integer phone;
Student(String name ,int age,char egx,Integer phone){
("默认的构造方法");
}
public Student(){
("调用无参构造方法。。。。。");
}
public Student(String name){
= name;
("name:"+name);
}
public Student(String name,int age){
("name:"+name+","+"age:"+age);
}
private Student(int age){
("私有的构造方法");
}
protected Student(boolean b){
("受保护的构造方法");
}
public String get(){
return "调用方法";
}
public String getMethod(String string){
return string + "是个大学老师!";
}
}
获取构造方法
/*
* 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
*
* 1.获取构造方法:
* 1).批量的方法:
* public Constructor[] getConstructors():所有"公有的"构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
* 2).获取单个的方法,并调用:
* public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
* public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
*
* 调用构造方法:
* Constructor-->newInstance(Object... initargs)
*/
("==================调用构造方法=====================");
Class clazz = ;
//类路径
(());
//获取所有的公共构造方法
Constructor[] constructors = ();
for (Constructor constructor : constructors){
(constructor);
}
//获取所有的构造方法 包含私有的受保护的
Constructor[] declaredConstructors = ();
for (Constructor constructor : declaredConstructors){
(constructor);
}
//获取 公共的参数为String的构造方法
Constructor constructor = ();
(constructor);
//获取公共的无参构造方法
Constructor constructor1 = (null);
(constructor1);
Object o = ();
Constructor declaredConstructor = ();
//暴力访问,忽略掉访问修饰符
(true);
Object object = ("男");
获取成员变量并调用:
/*
* 获取成员变量并调用:
*
* 1.批量的
* 1).Field[] getFields():获取所有的"公有字段"
* 2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
* 2.获取单个的:
* 1).public Field getField(String fieldName):获取某个"公有的"字段;
* 2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
*
* 设置字段的值:
* Field --> public void set(Object obj,Object value):
* 参数说明:
* :要设置的字段所在的对象;
* :要为字段设置的值;
*
*/
("=====================获取字段参数=====================");
Class clazz = ("");;
//获取所有公共参数
Field[] fields = ();
for(Field field : fields){
// (field);
}
//获取所有参数
Field[] declaredFields = ();
for (Field field : declaredFields){
(field);
}
//获取 name 参数
Field name = ("name");
// Student s = new Student();
Object o = (null).newInstance();
//给name 参数 赋值
(o,"黄磊");
Student s = (Student)o;
("验证名字:"+());
//获取私有参数
Field phone = ("phone");
//暴力访问,忽略掉访问修饰符
(true);
//第一个参数为设置的对象,第二个参数为要传入的实参
//等同与(12356789)
(o,123456789);
("验证电话:"+());
获取方法并调用
("=====================获取方法=======================");
Class clazz = ;
//获取所有公共的方法
Method[] methods = ();
//获取所以方法 包含私有的,受保护的
Method[] declaredMethods = ();
for (Method method : declaredMethods){
(());
}
Method getMethod = ("getMethod",);
//无参初始化
Object o1 = ();
//执行方法为私有的 得先设置私有可见
(true);
//传入参数,执行方法
Object o = (o1,"ww");
(());