Java反射Filed、Method、Constructor类_02
文章目录
- 1. Field类
- 1.2. Field类常用方法
- 2. Method类
- 2.1. Method类常用方法
- 3. Constructor类
- 3.1. Constructor类常用方法
- 4.JSON与Java对象互转工具类
1. Field类
Field类中提供了操作变量的方式,可以对变量数据获取与设置,包括可以操作私有变量
1.2. Field类常用方法
public Object get(Object obj)
:通过对象实例获取对象中属性的数据obj
:是指定实例对象,可以通过Class的newInstance()方法获取,或使用Constructor构造方法
public void set(Object obj, Object value)
:通过对象实例设置属性数据obj
:是指定实例对象,可以通过Class的newInstance()方法获取,或使用Constructor构造方法value
:属性的数据
public void setAccessible(boolean flag)
:强制忽略安全检测调用获取非public修饰的属性public String getName()
:获取属性名称public Class<?> getType()
:获取属性类型public int getModifiers()
:获取属性修饰符
// 通过Class.forName获取Class类Class<?> clazz = Class.forName("reflection.User");// 通过Class的newInstance方法获取User对象实例Object newInstance = clazz.newInstance();// 获取类中指定属性// 私有的Field id = clazz.getDeclaredField("id");// 公共的Field age = clazz.getDeclaredField("age");//1. `obj`:是指定要获取值的实例对象Object object = age.get(newInstance);System.out.println("object = " + object);// 2. `public void set(Object obj, Object value)`:通过对象实例设置属性数据// `obj`:是指定实例对象,可以通过Class的newInstance()方法获取,或使用Constructor构造方法// `value`:属性的数据age.set(newInstance, 18);object = age.get(newInstance);System.out.println("object = " + object);System.out.println("newInstance = " + newInstance);String name = age.getName();System.out.println("name = " + name);Class<?> type = age.getType();System.out.println("type = " + type);int modifiers = age.getModifiers();System.out.println("modifiers = " + modifiers);id.setAccessible(true);// 私有变量获取与设置Object object1 = id.get(newInstance);System.out.println("object1 = " + object1);id.set(newInstance, 111);object1 = id.get(newInstance);System.out.println("object1 = " + object1);System.out.println("newInstance = " + newInstance);
2. Method类
Method类中提供了操作方法的方式,可以对方法获取或调用,包括可以操作私有方法
2.1. Method类常用方法
public String getName()
:获取方法名称public int getModifiers()
:获取方法修饰符public int getParameterCount()
:获取方法形参数量public Class<?> getReturnType()
:获取方法返回值类型public Class<?>[] getParameterTypes()
:获取方法形参类型public Object invoke(Object obj, Object... args)
:调用此方法obj
:是指定实例对象,可以通过Class的newInstance()方法获取,或使用Constructor构造方法args
:形参参数
public void setAccessible(boolean flag)
:强制忽略安全检测调用获取非public修饰的属性
// 获取User实例对象Class<?> clazz = Class.forName("reflection.User");Object newInstance = clazz.newInstance();// 私有方法Method method1 = clazz.getDeclaredMethod("method", Integer.class);// 公共方法Method method2 = clazz.getDeclaredMethod("method", String.class, String.class);// 1. `public String getName()`:获取方法名称String name = method2.getName();System.out.println("name = " + name);// 2. `public int getModifiers()`:获取方法修饰符int modifiers = method2.getModifiers();System.out.println("modifiers = " + modifiers);// 3. `public int getParameterCount()`:获取方法形参数量int parameterCount = method2.getParameterCount();System.out.println("parameterCount = " + parameterCount);// 4. `public Class<?> getReturnType()`:获取方法返回值类型Class<?> returnType = method2.getReturnType();System.out.println("returnType = " + returnType);// 5. `public Class<?>[] getParameterTypes()`:获取方法形参类型Class<?>[] parameterTypes = method2.getParameterTypes();System.out.println("Arrays.toString(parameterTypes) = " + Arrays.toString(parameterTypes));// 6. `public Object invoke(Object obj, Object... args)`:调用此方法// 1. `obj`:是指定实例对象,可以通过Class的newInstance()方法获取,或使用Constructor构造方法// 2. `args`:形参参数System.out.println("====================================");Object returnValue = method2.invoke(newInstance, "彭于晏", "男");System.out.println("returnValue = " + returnValue);// 打印newInstance对象System.out.println("newInstance = " + newInstance);// 7. `public void setAccessible(boolean flag)`:强制忽略安全检测调用获取非public修饰的属性System.out.println("====================================");String name1 = method1.getName();System.out.println("name1 = " + name1);// 调用非public修饰的方法必须设置setAccessible忽略安全检测method1.setAccessible(true);method1.invoke(newInstance, 1);System.out.println("newInstance = " + newInstance);
3. Constructor类
Constructor类中提供了操作构造方法的方式,可以对构造方法获取或设置,包括可以操作私有的构造方法
3.1. Constructor类常用方法
public String getName()
:获取构造方法名称public int getModifiers()
:获取构造方法修饰符public int getParameterCount()
:获取构造方法形参数量public Class<?>[] getParameterTypes()
:获取构造方法形参类型public T newInstance(Object ... initargs)
:调用构造方法,并指定形参数据initargs
:形参参数
public void setAccessible(boolean flag)
:强制忽略安全检测调用获取非public修饰的属性
// 获取User实例对象Class<?> clazz = Class.forName("reflection.User");// 私有构造方法Constructor<?> constructor1 = clazz.getDeclaredConstructor(Integer.class);// 公共构造方法Constructor<?> constructor2 = clazz.getDeclaredConstructor(Integer.class, String.class, String.class, Integer.class);// 1. `public String getName()`:获取构造方法名称String name = constructor2.getName();System.out.println("name = " + name);// 2. `public int getModifiers()`:获取构造方法修饰符int modifiers = constructor2.getModifiers();System.out.println("modifiers = " + modifiers);// 3. `public int getParameterCount()`:获取构造方法形参数量int parameterCount = constructor2.getParameterCount();System.out.println("parameterCount = " + parameterCount);// 4. `public Class<?>[] getParameterTypes()`:获取构造方法形参类型Class<?>[] parameterTypes = constructor2.getParameterTypes();System.out.println("Arrays.toString(parameterTypes) = " + Arrays.toString(parameterTypes));// 5. `public T newInstance(Object ... initargs)`:调用构造方法,并指定形参数据// 1. `initargs`:形参参数System.out.println("====================================");Object instance = constructor2.newInstance(1, "彭于晏", "男", 18);System.out.println("instance = " + instance);// 6. `public void setAccessible(boolean flag)`:强制忽略安全检测调用获取非public修饰的属性System.out.println("====================================");int modifiers1 = constructor1.getModifiers();System.out.println("modifiers1 = " + modifiers1);// 调用私有的构造方法需要设置忽略安全检测constructor1.setAccessible(true);Object instance1 = constructor1.newInstance(1);System.out.println("instance1 = " + instance1);
Field、Method、Constructor结合使用
public static void main(String[] args) throws Exception {// 获取Student的Class对象Class<?> clazz = Class.forName("reflection.Student");// 获取构造方法Constructor<?> constructor = clazz.getConstructor(Integer.class, String.class, String.class);// 创建User对象实例-->此实例也用于后面的方法和属性使用Object instance = constructor.newInstance(1, "古天乐", "男");System.out.println("instance = " + instance);// 获取属性Field id = clazz.getDeclaredField("id");Field name = clazz.getDeclaredField("name");Field gender = clazz.getDeclaredField("gender");// 设置setAccessible强制忽略安全检测调用非public修饰的属性id.setAccessible(true);name.setAccessible(true);gender.setAccessible(true);// 获取属性数据System.out.println("修改前");Object idValue = id.get(instance);System.out.println("idValue = " + idValue);Object nameValue = name.get(instance);System.out.println("nameValue = " + nameValue);Object genderValue = gender.get(instance);System.out.println("genderValue = " + genderValue);// 设置属性数据id.set(instance, 2);name.set(instance, "古校长");gender.set(instance, "男神");// 获取属性数据System.out.println("修改后");Object idValue1 = id.get(instance);System.out.println("idValue1 = " + idValue1);Object nameValue1 = name.get(instance);System.out.println("nameValue1 = " + nameValue1);Object genderValue1 = gender.get(instance);System.out.println("genderValue1 = " + genderValue1);// 获取方法// 获取get方法Method getIdMethod = clazz.getMethod("getId");Method getNameMethod = clazz.getMethod("getName");Method getGenderMethod = clazz.getMethod("getGender");// 调用方法System.out.println("修改前");Object result1 = getIdMethod.invoke(instance);System.out.println("result1 = " + result1);Object result2 = getNameMethod.invoke(instance);System.out.println("result2 = " + result2);Object result3 = getGenderMethod.invoke(instance);System.out.println("result3 = " + result3);// 获取set方法Method setIdMethod = clazz.getMethod("setId", Integer.class);Method setNameMethod = clazz.getMethod("setName", String.class);Method setGenderMethod = clazz.getMethod("setGender", String.class);// 调用方法setIdMethod.invoke(instance, 1);setNameMethod.invoke(instance, "古天乐");setGenderMethod.invoke(instance, "男神");// 调用方法System.out.println("修改后");result1 = getIdMethod.invoke(instance);System.out.println("result1 = " + result1);result2 = getNameMethod.invoke(instance);System.out.println("result2 = " + result2);result3 = getGenderMethod.invoke(instance);System.out.println("result3 = " + result3);// 获取toString方法并调用Method toString = clazz.getMethod("toString");Object result = toString.invoke(instance);System.out.println("result = " + result);System.out.println("instance = " + instance);}
4.JSON与Java对象互转工具类
/*** JSON互转工具类*/
public class JSON {/*** Java对象转JSON字符串方法** @param obj 传入需要转换的Java对象* @return 返回转换后的JSON字符串*/public static String toJSONString(Object obj) {// 1. 获取传入的对象的Class类Class<?> clazz = obj.getClass();// 2. 获取所有的属性Field[] fields = clazz.getDeclaredFields();// 定义StringBuilder拼接字符串StringBuilder sb = new StringBuilder("{");// 3. 遍历所有的属性for (int i = 0; i < fields.length; i++) {// 4. 设置setAccessible强制忽略安全检测fields[i].setAccessible(true);try {// 5. 获取属性名称和属性值和属性类型Class<?> fieldType = fields[i].getType();String fieldName = fields[i].getName();Object fieldValue = fields[i].get(obj);// 6. 拼接JSON字符串// 判断属性类型是否是Stringif (fieldType == String.class) {// 判断是否是最后一个属性if (i == fields.length - 1) {// 拼接数据// {"age":18,"gender":"男","id":1,"name":"彭于晏"}sb.append("\"" + fieldName + "\":" + "\"" + fieldValue + "\"}");continue;}sb.append("\"" + fieldName + "\":" + "\"" + fieldValue + "\",");continue;}// 判断是否是最后一个属性if (i == fields.length - 1) {// 拼接数据// {"age":18,"gender":"男","id":1,"name":"彭于晏"}sb.append("\"" + fieldName + "\":" + "" + fieldValue + "}");continue;}sb.append("\"" + fieldName + "\":" + "" + fieldValue + ",");} catch (IllegalAccessException e) {e.printStackTrace();}}return sb.toString();}/*** 将JSON字符串转为Java对象** @param jsonString JSON字符串* @param clazz 需要转换的Class类型* @param <T> 泛型类型变量* @return 返回转换后的对象*/public static <T> T parseObject(String jsonString, Class<T> clazz) {// 通过Class获取实例对象try {T instance = clazz.newInstance();// 解析JSON字符串// {"id":1,"name":"彭于晏","gender":"男"}// 去除JSON字符串的大括号以及双引号jsonString = jsonString.replace("{", "").replace("}", "").replace("\"", "");// 逗号分割String[] split = jsonString.split(",");// 遍历split分割的数组for (String keyValue : split) {// 再通过冒号:分割String[] keyAndValue = keyValue.split(":");// 获取属性Field field = clazz.getDeclaredField(keyAndValue[0]);// 设置忽略安全检测field.setAccessible(true);// 获取属性的类型Class<?> fieldType = field.getType();// 判断type类型if (fieldType == String.class) {field.set(instance, keyAndValue[1]);continue;}// 如果不是String就是Integerfield.set(instance, Integer.valueOf(keyAndValue[1]));}// 返回T泛型类型对象return instance;} catch (Exception e) {e.printStackTrace();}// 如果出现异常则返回nullreturn null;}
}
Java反射Filed、Method、Constructor类_02相关推荐
- java 反射Reflection;Class类
1.反射机制概述 java能够反射的前提:已经加载过这个类 反射可以通过类名来寻找这个类的所有相关信息.类似于人类的记忆,事先在记忆中有了这个事物的信息,人就可以通过名字来在记忆中寻找事物的具体信息. ...
- Java反射机制(反射Field,Method,Constructor,资源绑定器)
目录 反射机制 1.反射机制的作用 2.反射机制的相关类在哪个包下 3.反射机制的相关类有哪些 获取Class的三种方式 通过反射实例化对象 通过读属性文件实例化对象 只让静态代码块执行可以使用for ...
- java 防止反射_如何防止JAVA反射对单例类的攻击?
在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...
- 浅谈Java反射机制 之 获取类的字节码文件 Class.forName(全路径名) 、getClass()、class...
先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对 ...
- JAVA反射机制、Class类及动态加载、成员变量构造方法其他方法的反射与调用、代理模式AOP
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言 ...
- java日期用什么属性_java日期以及使用Java反射机制遍历实体类的属性和类型
fmt:formatDate 的输出格式 fmt关于时间格式的输出 2004-5-31 23:59:59 2004-4-1 23:59:59 JSTL标签fmt:formatDate引起的中文乱码问题 ...
- Java反射使用的Field类介绍
一.Field类的作用 Field是一个类,位于java.lang.reflect包下.在Java反射中Field类描述的是类的属性信息,功能包括 (1)获取当前对象的成员变量的类型 (2)对成员变量 ...
- Java反射机制涉及的类常见方法使用总结
1 import java.lang.reflect.Constructor; 2 import java.lang.reflect.*; 3 4 /*Class:代表一个字节码文件的对象,每当有类被 ...
- Java反射之如何判断类或变量、方法的修饰符(Modifier解析)
a->public b->public static c->public static final d->private 就是返回这些 https://blog.csdn.ne ...
最新文章
- python中内置的四种数值类型为_浅谈python语言四种数值类型
- IOS面试经常被问到的问题
- Katalon Studio之swagger中的API导入
- SVN mime-type 笔记
- 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef
- K8S Learning(4)——Namespace
- java 实现excel 导出功能
- potplayer 多个进程_进程组、会话、控制终端概念,如何创建守护进程?
- ccie计算机网络英语,最新版CCIE Voice 语音方向 WOLF实验全套语音课程(含版本)...
- 【报告分享】2021年社区团购研究报告.pdf(附下载链接)
- LeetCode(1029)——两地调度(JavaScript)
- java 多态 重载的区别_重写、覆盖、重载、多态几个概念的区别分析
- 吴恩达神经网络和深度学习-学习笔记-24-在不同的划分上进行训练和测试+不匹配数据划分的偏差和方差
- Python 内置函数介绍
- 场景法、流程分析法、错误推断法
- RSSHub让万物皆可RSS
- 我设计的五笔日本语输入法和韩语输入法初稿图
- 机器人设计的步骤有哪些
- 互联网创业公司的一段经历
- 程序员就是这样聊天把女朋友聊没的。。。