博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day13(反射,BeanUtils包)
阅读量:6692 次
发布时间:2019-06-25

本文共 6096 字,大约阅读时间需要 20 分钟。

反射,

  获取字节码文件的方式:

    方式一: 对象.getClass();

    方式二: 类名.Class;

    方式三:   Class.forName(String Class);

  通过字节码文件获取对象

    定义一个Student对象

package day13;public class Student {	private String name;	private int age;	public Student() {		super();		// TODO Auto-generated constructor stub	}	public Student(String name, int age) {		super();		this.name = name;		this.age = age;	}	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;	}	@Override	public String toString() {		return "Student [name=" + name + ", age=" + age + "]";	}     public void run(int a){
    System.out.println("学生已经跑了"+a+"小时了......");     } }

  

public class FieldDemo {	public static void main(String[] args) throws Exception {		//获取字节码文件		Class
forName = Class.forName("day13.Student");//Student为项目中的全路径           //获取对象              Object newInstance = forName.newInstance(); } }

 

    通过字节码文件获取构造方法

 

public class FieldDemo {	public static void main(String[] args) throws Exception {		//获取字节码文件		Class
forName = Class.forName("day13.Student"); //获取构造方法对象 Object newInstance = forName.newInstance(); //获取构造方法列表 Constructor[] declaredConstructors = forName.getDeclaredConstructors();//获取构造方法列表 for (Constructor constructor : declaredConstructors) { System.out.println(constructor); } Constructor constructor = forName.getConstructor();//获取空参构造 System.out.println(constructor); Constructor
constructor2 = forName.getConstructor(String.class,int.class);//获取有参构造 System.out.println(constructor2); Constructor
[] declaredConstructors2 = forName.getDeclaredConstructors();//获取私有和公有的构造方法列表 for (Constructor
constructor3 : declaredConstructors2) { System.out.println(constructor3); } Constructor
c = forName.getDeclaredConstructor(String.class,int.class);//获取所有的(私有和公有)的有参构造 System.out.println(c); Constructor
c1 = forName.getDeclaredConstructor();//获取所有的(私有和公有)的无参构造 System.out.println(c1); }}

  

     通过字节码文件和对象为字段赋值

  

public class FieldDemo {	public static void main(String[] args) throws Exception {		//获取字节码文件		Class
forName = Class.forName("day13.Student"); //获取构造方法对象 Object newInstance = forName.newInstance(); //获取字段 Field age = forName.getDeclaredField("age");//获取age字段 age.setAccessible(true);//如果是私有的则需要打开开关 age.set(newInstance,15);//设置age的值为15 Field name = forName.getDeclaredField("name"); name.setAccessible(true); System.out.println(name.get(newInstance));//赋值前查看其值 name.set(newInstance,"张三"); System.out.println(name.get(newInstance));//赋值后查看其值 System.out.println(newInstance);//打印对象 }}

      通过公共构造方法进行赋值

public class FieldDemo {	public static void main(String[] args) throws Exception {		//获取字节码文件		Class
forName = Class.forName("day13.Student"); //获取构造方法对象 Object o = forName.newInstance(); //获取字段 Constructor
constructor = forName.getConstructor(String.class,int.class); //通过构造方法调用对象 Object newInstance2 = constructor.newInstance("张三",15);//同过构造方法进行赋值 System.out.println(newInstance2); }}

      通过私有构造方法进行赋值

public class FieldDemo {	public static void main(String[] args) throws Exception {		//获取字节码文件		Class
forName = Class.forName("day13.Student"); //获取构造方法对象 Object o = forName.newInstance(); //获取字段 Constructor
constructor = forName.getDeclaredConstructor(String.class,int.class); constructor.setAccessible(true); //通过构造方法调用对象 Object newInstance2 = constructor.newInstance("张三",15);//同过构造方法进行赋值 System.out.println(newInstance2); }}

    通过方法get/Set方法进行赋值

public class FieldDemo {	public static void main(String[] args) throws Exception {		//获取字节码文件		Class
forName = Class.forName("day13.Student"); //获取构造方法对象 Object o = forName.newInstance(); //获取字段 Method[] methods = forName.getDeclaredMethods();//获取Student中全部方法 for (Method method : methods) { //System.out.println(method); } System.out.println("------------"); //Method md = forName.getDeclaredMethod("setName"); Method md = forName.getMethod("setName",String.class);//传递参数 md.invoke(o, "张三"); Method md1 = forName.getDeclaredMethod("getName");//执行getName方法 Object name = md1.invoke(o); System.out.println(name); }}

  通过字节码文件调用方法

  调用Student 类中的run(int a);

 

public class FieldDemo {	public static void main(String[] args) throws Exception {		//获取字节码文件		Class
forName = Class.forName("day13.Student"); //获取构造方法对象 Object o = forName.newInstance(); //参数一 方法名 参数二 参数类型对象的类 (参数列表) Method m = forName.getMethod("run",int.class); //参数一 对象 参数二 参数值(参数列表) m.invoke(o, 2); }}

 

  

 

通过反射可以获取类中的所有成员方,成员变量,构造方法(包括私有)。  仅仅只需要一个字符串就可以搞定了

 JavaBean  对数据的封装   其实就是标准类  用于存储字段的

 

BeanUtils包

  1.自己书写BeanUtils包

public class MyBeanUtils {	public static void setProperty(Object bean, String name, Object value) {//给单个字段设置值		Class
class1 = bean.getClass(); ArrayList
array=new ArrayList
(); Field[] fields = class1.getFields(); for (int i = 0; i < fields.length; i++) { array.add(fields[i].getName()); } Field[] declaredFields = class1.getDeclaredFields(); for (int i = 0; i < declaredFields.length; i++) { array.add(declaredFields[i].getName()); } if (array.contains(name)) { try { Field field = class1.getDeclaredField(name); field.setAccessible(true); field.set(bean, value); } catch (Exception e) { try{ Field field = class1.getField(name); field.set(bean, value);} catch(Exception e1){ } } }else{ System.out.println("你输入的字段["+name+"]不存在!"); } } public static Object getProperty(Object bean, String name) {//获取单个属性的值 Class
cs = bean.getClass(); Object object=null; try { Field field = cs.getDeclaredField(name); field.setAccessible(true); object = field.get(bean); } catch (Exception e) { } return object; } public static void populate(Object bean, Map map){//设置多个字段值 Set keys = map.keySet(); for (Object key : keys) { try{ setProperty(bean, (String) key, map.get(key)); }catch(Exception e){ } } }}

  

 

转载于:https://www.cnblogs.com/fjkgrbk/p/reflect_day.html

你可能感兴趣的文章
Spring 与Hibernate 整合
查看>>
Scala编译器安装
查看>>
BGP中COMMUNITY属性
查看>>
2018年最受欢迎的五大机器学习工具和五大数据学习工具
查看>>
冒泡排序—冒泡排序算法优化
查看>>
SpringCloud Feign 传递复杂参数对象需要注意的地方
查看>>
正则表达式储备(一)
查看>>
英语单词(计算机类)
查看>>
正则表达式讲解
查看>>
for循环展开为duff装置技术
查看>>
第二_文件权限
查看>>
安卓7.0系统手机最简单激活xposed框架的教程
查看>>
nginx命令详解
查看>>
C++初入门
查看>>
Tar 归档命令的一点心得
查看>>
ip 命令 和ifconfig 命令 删除IP
查看>>
Caching
查看>>
Centos yum 邮件服务器配置 CentOS release 6.3 (Final)
查看>>
《配电网自动化技术》第四、五章
查看>>
Mysql(手动编译详细思路,以及增删改查,授权,备份还原)
查看>>