java面向对象---反射和反射的应用

一、反射
	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);
				}
			}
		}
			
			
			
			
		
		

猜你喜欢

转载自blog.csdn.net/jeremy_ke/article/details/81289114