博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射工具类_反射和BeanUtils工具类的使用
阅读量:6269 次
发布时间:2019-06-22

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

反射和BeanUtils工具类的使用

一、反射

1、获取字节码对象

A、对象

Student s =  new Student();

Class clazz =  s.getClass();

B、类名

Class clazz =  Student.class;

C、全类名

Class clazz  = Class.forName(“全路径类名.Student”)(推荐使用)

2、获取构造方法

作用:对成员进行初始化

A、获取全部public构造方法;获取的是一个构造方法集合

Constructor[] cs = clazz.getConstructors();

B、获取无参构造方法

Constructor c = clazz.getConstructor();//获取无参构造

C、获取带参的有参构造方法

Constructor c = clazz.getConstructor(String.class,int.class);//获取有参构造,参数1类型为String,参数2类型为int

直接通过Class类中的newInstance()和获取getConstructor()有什么区别?

newInstance()方法,只能通过空参的构造方法创建对象

getConstructor(Class…parameterTypes)方法,方法接受一个可变参数,可以根据传入的类型来匹配对应的构造方法

3、反射操作成员变量。

1). 通过反射获取该类的字节码对象

Class clazz = Class.forName("com.heima.Person");

2.) 创建该类对象

Object p = clazz.newInstance();

3.) 获取该类中需要操作的字段(成员变量)

getField(String name) --> 方法传入字段的名称.

注意: 此方法只能获取公共的字段

Field f = clazz.getField("age");

4.) 通过字段对象中的方法修改属性值

void set(Object obj, Object value)  --> 参数1):要修改那个对象中的字段,参数2):将字段修改为什么值.

如果变量是私有变量

需要进行强制访问

反射private属性执行流程

1.) 获取学生类字节码对象

2. )获取学生对象

3. )通过getDeclaredField方法获取私有字段

4. )通过setAccessible让jvm不检查权限

5. )通过set方法设置对象为具体的值

public class ReflectDemo4 {

public static void main(String[] args) throws ReflectiveOperationException {

//获取学生类的字节码对象

Class clazz = Class.forName("com.itheima_01.Student");

//获取学生对象

Object stu = clazz.newInstance();

//获取私有的字段对象

Field f = clazz.getDeclaredField("name");

f.setAccessible(true);//设置反射时取消Java的访问检查,暴力访问

//System.out.println(f);

f.set(stu, "lisi");

Object name = f.get(stu);

System.out.println(name);

}

4、获取成员方法

// 获取字节码对象

Class clazz = Class.forName("com.heima.Student");

// 创建学生对象

Object stu = clazz.newInstance();

// 暴力反射获取方法

Method method = clazz.getDeclaredMethod("method");

// 让jvm不检查权限

method.setAccessible(true);

// 执行方法

method.invoke(stu);

二、JavaBean的概述、BeanUtils的使用

1、avaBean类:用于封装数据

A、类使用用public修饰、

B、提供私有修饰的成员变量

C、提供变量公共的get/set方法

D、提供无参构造

E、实现序列接口

类的定义例如

public class  Student  implements Serializable{

}

2、BeanUtils 工具类

使用前需要进行架包使用

主要的使用方法

1).导入两个jar包

commons-beanutils-1.8.3.jar

commons-logging-1.1.1.jar

2. )将jar包Build path配置到当前的classpath环境变量中

static void    setProperty(Object bean, String name, Object value)

setProperty  用来给对象中的属性赋值(了解)

参数1: 需要设置属性的对象

参数2: 需要修改的属性名称

参数3: 需要修改的具体元素

static String getProperty(Object bean, String name)

getProperty 用来获取对象中的属性(了解)

参数1: 要获取的javaBean对象

参数2: 对象中的哪个属性

static void    populate(Object bean, Map properties)

参数1: 要设置属性的对象

参数2: 将属性以Map集合的形式传入

Key : 属性的名称

Value:  属性具体的值

public class BeanUtilsDemo {

public static void main(String[] args) throws ReflectiveOperationException  {

//static void        populate(Object bean, Map properties)

Person p = new Person();

Map map = new HashMap();

map.put("name", "lisi");

map.put("age", 18);

map.put("gender", "male");

BeanUtils.populate(p,map);

System.out.println(p);

}

3、自己编写MyBeanUtils工具

import java.lang.reflect.Field;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

public class MyBeanUtils {

public static void setProperty(Object bean , String name , Object value) throws  Exception{

Class clazz = bean.getClass();

Field f = clazz.getDeclaredField(name);

//设置权限,让虚拟机不进行访问检查

f.setAccessible(true);

//赋值

f.set(bean,value);

}

public static String  getProperty(Object bean,String name) throws  Exception{

Class clazz = bean.getClass();

Field f = clazz.getDeclaredField(name);

f.setAccessible(true);

Object obj = f.get(bean);

return obj.toString();

}

public static void populate(Object bean , Map map) throws ReflectiveOperationException{

Class clazz =  bean.getClass();

Set keys = map.keySet();

for (Object key : keys) {

try {

Field f = clazz.getDeclaredField(key.toString());

Object value = map.get(key);

f.setAccessible(true);

f.set(bean, value);

} catch (NoSuchFieldException e) {

}

}

}

}

转载地址:http://wxspa.baihongyu.com/

你可能感兴趣的文章
[java] java 线程join方法详解
查看>>
JQuery datepicker 用法
查看>>
golang(2):beego 环境搭建
查看>>
天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十)态势标绘模块
查看>>
程序员社交宝典
查看>>
ABP理论学习之MVC控制器(新增)
查看>>
Netty中的三种Reactor(反应堆)
查看>>
网页内容的html标签补全和过滤的两种方法
查看>>
前端源码安全
查看>>
【CodeForces 618B】Guess the Permutation
查看>>
【转】如何实现一个配置中心
查看>>
Docker —— 用于统一开发和部署的轻量级 Linux 容器【转】
查看>>
Threejs 官网 - Three.js 的图形用户界面工具(GUI Tools with Three.js)
查看>>
Atitit.Java exe bat 作为windows系统服务程序运行
查看>>
session的生命周期
查看>>
数据库的本质、概念及其应用实践(二)
查看>>
iOS开发多线程--(NSOperation/Queue)
查看>>
php的ajax简单实例
查看>>
maven常用构建命令
查看>>
C#:关联程序和文件
查看>>