反射
主要是通过类加载,动态的访问,检测和修改类本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关语义。
正常方式:
引入需要的"包.类" --> new实例化 --> 取得实例化对象
反射方式:
获取目标的Class对象 --> 得到类的完整信息 --> 取得实例化对象
反射的常用类
Class:Constructor、Field、Method…
接下来就用代码的形式演示反射的用法
public class Demo(){
public String name;
private int age;
public Date birthday;
public Demo(String name, int age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
//获取目标实例三种方法
//1、只进行类加载,不进行初始化,对只获取类信息很好用
Class<Demo> cl1=Demo26.class;
//2、对目标进行类加载,进行静态初始化
Class cl2=Class.forName("com.类全名.Demo");
//3、对类进行加载,进行初始化
Class cl3=new Demo().getClass();
//获取类修饰符,getModifiers返回的是int类型,Modifier.toString将其写为访问修饰符
Modifier.toString(cl1.getModifiers());
//cl1.getName()、cl1.getSimpleName()分别访问类全名和类名
//supCl是血缘最近的父类,他也是一个Class,所以拥有同样的一些操作
Class superCl=cl1.getSuperclass();
//getInterfaces()获得这个class实现的多有接口名,用数组存储
//而接口同样是类,也可以实现Class的操作
Class[] InterCl=cl1.getInterfaces();
//获取构造器
Constructor<Demo> con=cl1.getDeclaredConstructor(String.class,int.class,Date.class);
//获取构造器修饰符
Modifier.toString(con.getModifiers());
//获取本类所有构造器
Constructor[] cons=cl1.getDeclaredConstructors();
//利用构造器创建目标类对象new Demo()
Demo demo = con.newInstance("Jack",19,new Date());
//Filed类
//获取目标属性
Field field1=cl1.getDeclaredFiled("age");
//获取属性修饰
Modifier.toString(field1.getModifiers());
//获取属性类型
field1.getType().getSimpleName();
//获取属性名称
field1.getName();
//突破访问权限private,这里age设置的private,具体到某个实例中,如:
Demo demo=cl1.newInstance();//实例
field1.setAccessible(true);//突破权限设置
field1.set(demo,2);//设置某实例的该属性
field1.get(demo);//获得属性值
Field[] fields=cl1.getFields();
//此处返回本类及所有祖先的public属性的数组集
//如果是getDeclaredFields则返回本类的所有属性的数组集
//Method类
Method[] methods=cl1.getMethods();
//此处返回本类及所有祖先的public方法的数组集
//如果是getDeclaredMethods则返回本类的所有方法的数组集
//获取目标方法
Method setAgeMethod=cl1.getDeclaredMethod("setAge", int.class);
//获取方法修饰
Modifier.toString(setAgeMethod.getModifiers());
//获取返回类型
setAgeMethod.getReturnType().getSimpleName();
//获取方法名
setAgeMethod.getName();
//获取所有抛出的异常
Class[] excep=setAgeMethod.getExceptionTypes();
//使用方法
Object obj = setAgeMethod.invoke(demo,12);
Method getAgeMethod=cl1.getDeclaredMethod("getAge");
Object obj = getAgeMethod.invoke(demo);
System.out.println(obj);
以上就是类反射的用法,涉及到的有Class、Constructor、Field、Method类,其中后三者的用法很多都是差不多的,例如Modifier.toString(E.getModifiers())去获取访问修饰符,getDeclaredDemos()、getDemos()(Demo是具体的类)去获取该类的数组集合。其他就需要去多熟练使用,这是作为充分掌握并利用java的重要知识点。
落笔于2019/4/26 17:22