一、反射
1. 理解:在运行时,可以获取任意一个类的所有属性和方法。
(在运行时,把一个类的字节码分解成员变量,成员方法,构造方法)
注意:必须有字节码才能进行反射操作
2. 如何获取类的字节码呢?
1)类名.class
Class clazz=Student.class
2)对象名.getClass()
Student s=new Student();
Class clazz=s.getClass();
3)Class.forName(类的全名)
Class clazz=Class.forName("com.itheima.Student");
3. 通过反射获取 构造方法,成员变量,成员方法
1)反射获取构造方法
获取公有的:
Constructor getConstructor(参数类型)
获取一个非私有的构造方法,注意:参数类型有就写,没有就不用写
Constructor[] getConstructors()
获取所有非私有的构造方法
暴力反射:私有的也可以获取
Constructor getDeclaredConstructor(参数类型)
获取一个私有的构造方法,注意:参数类型有就写,没有就不用写
Constructor[] getDeclaredConstructors()
获取所有的构造方法(包括私有的)
如果有参数数构造方法且不是私有的,简单的创建对象的方式
//简单创建对象的方式,本质上就是在调用空参数构造方法
Student s = (Student) clazz.newInstance();
System.out.println(s);
获取构造方法之后,创建对象:
//获取构造方法
Constructor c1=clazz.getConstructor(参数类型);
//执行构造方法,创建对象
Object obj = c1.newInstance(参数值); //等价于 new Student(参数值)
2)反射获取成员变量
获取公有的:
Field getFiled()
获取一个成员变量,只包括public修饰的
Field[] getFileds()
获取所有公共的成员变量,只包括public修饰的
暴力反射:私有的也可以获取
Field getDeclaredFiled()
获取一个成员变量,包括私有的
Field[] getDeclaredFileds()
获取所有的成员变量(包括私有的)
获取变量之后:对变量进行修改和获取
set(对象,值)
get(对象)
3)反射获取成员方法
获取公有的:
Method getMethod()
获取一个公有的成员方法
Method[] getMethods()
获取所有公有的成员方法
暴力反射:私有的也可以获取
Method getDeclaredMethod()
获取一个成员方法(私有的可以)
Method[] getDeclaredMethods()
获取所有的成员方法(私有的可以)
获取方法之后:对方法进行调用
Object invoke(Object obj, Object... args)
调用方法
二、反射应用
1. javabean理解: 有一定规则的类
1)private修饰成员变量
2)提供空参数构造方法
3)提供set和get方法
4)实现Serializable接口(可选项)
javabean类,主要就是用来封装数据的。
2. 写一个工具类是为了给任意javabean对象的成员变量赋值
//自定义工具类:为了给任意javabean对象的任意属性赋值
class MyBeanUtils{
//私有化构造方法:为了不让其他类创建对象
private MyBeanUtils(){
}
//给javabean对象的指定属性赋值的方法setProperty
public static void setProperty(Object bean,String name,Object value){
//获取bean对象的字节码
Class clazz=bean.getClass();
//获取属性名为name的字段(成员变量)
Field f=clazz.getDeclaredFiled(name);
//取消权限检查
f.setAccessible(true);
//给成员变量赋值为value
f.set(bean,value);
}
//获取javabean对象的指定属性值
public static String getProperty(Object bean,String name){
//获取bean对象的字节码
Class clazz=bean.getClass();
//获取属性名为name的字段(成员变量)
Field f=clazz.getDeclaredFiled(name);
//取消权限检查
f.setAccessible(true);
//获取指定字段的值
Object value=f.get(bean);
return value.toString();
}
//给javabean对象的所有属性赋值,把属性-值当做键值对,存储到HashMap集合中
public static populate(Object bean,HashMap<String,Object> map){
//获取bean对象的字节码
Class clazz=bean.getClass();
//获取map中所有的键(属性名)
Set<String> keys=map.keySet();
//遍历所有的键(属性名)
for(String key:keys){
//获取key对应的值
Object value=map.get(key);
//获取属性名为key的字段
Field f=clazz.getDeclaredFiled(key);
f.setAccessible(true);
//给字段赋值
f.set(bean,value);
}
}
}
java面向对象---反射和反射的应用
猜你喜欢
转载自blog.csdn.net/jeremy_ke/article/details/81289114
今日推荐
周排行