文章目录

  • 1. Field类
    • 1.2. Field类常用方法
  • 2. Method类
    • 2.1. Method类常用方法
  • 3. Constructor类
    • 3.1. Constructor类常用方法
  • 4.JSON与Java对象互转工具类

1. Field类

Field类中提供了操作变量的方式,可以对变量数据获取与设置,包括可以操作私有变量

1.2. Field类常用方法

  1. public Object get(Object obj):通过对象实例获取对象中属性的数据

    1. obj:是指定实例对象,可以通过Class的newInstance()方法获取,或使用Constructor构造方法
  2. public void set(Object obj, Object value):通过对象实例设置属性数据
    1. obj:是指定实例对象,可以通过Class的newInstance()方法获取,或使用Constructor构造方法
    2. value:属性的数据
  3. public void setAccessible(boolean flag):强制忽略安全检测调用获取非public修饰的属性
  4. public String getName():获取属性名称
  5. public Class<?> getType():获取属性类型
  6. 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类常用方法

  1. public String getName():获取方法名称
  2. public int getModifiers():获取方法修饰符
  3. public int getParameterCount():获取方法形参数量
  4. public Class<?> getReturnType():获取方法返回值类型
  5. public Class<?>[] getParameterTypes():获取方法形参类型
  6. public Object invoke(Object obj, Object... args):调用此方法
    1. obj:是指定实例对象,可以通过Class的newInstance()方法获取,或使用Constructor构造方法
    2. args:形参参数
  7. 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类常用方法

  1. public String getName():获取构造方法名称
  2. public int getModifiers():获取构造方法修饰符
  3. public int getParameterCount():获取构造方法形参数量
  4. public Class<?>[] getParameterTypes():获取构造方法形参类型
  5. public T newInstance(Object ... initargs):调用构造方法,并指定形参数据
    1. initargs:形参参数
  6. 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相关推荐

  1. java 反射Reflection;Class类

    1.反射机制概述 java能够反射的前提:已经加载过这个类 反射可以通过类名来寻找这个类的所有相关信息.类似于人类的记忆,事先在记忆中有了这个事物的信息,人就可以通过名字来在记忆中寻找事物的具体信息. ...

  2. Java反射机制(反射Field,Method,Constructor,资源绑定器)

    目录 反射机制 1.反射机制的作用 2.反射机制的相关类在哪个包下 3.反射机制的相关类有哪些 获取Class的三种方式 通过反射实例化对象 通过读属性文件实例化对象 只让静态代码块执行可以使用for ...

  3. java 防止反射_如何防止JAVA反射对单例类的攻击?

    在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...

  4. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName(全路径名) 、getClass()、class...

    先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对 ...

  5. JAVA反射机制、Class类及动态加载、成员变量构造方法其他方法的反射与调用、代理模式AOP

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言 ...

  6. java日期用什么属性_java日期以及使用Java反射机制遍历实体类的属性和类型

    fmt:formatDate 的输出格式 fmt关于时间格式的输出 2004-5-31 23:59:59 2004-4-1 23:59:59 JSTL标签fmt:formatDate引起的中文乱码问题 ...

  7. Java反射使用的Field类介绍

    一.Field类的作用 Field是一个类,位于java.lang.reflect包下.在Java反射中Field类描述的是类的属性信息,功能包括 (1)获取当前对象的成员变量的类型 (2)对成员变量 ...

  8. Java反射机制涉及的类常见方法使用总结

    1 import java.lang.reflect.Constructor; 2 import java.lang.reflect.*; 3 4 /*Class:代表一个字节码文件的对象,每当有类被 ...

  9. Java反射之如何判断类或变量、方法的修饰符(Modifier解析)

    a->public b->public static c->public static final d->private 就是返回这些 https://blog.csdn.ne ...

最新文章

  1. python中内置的四种数值类型为_浅谈python语言四种数值类型
  2. IOS面试经常被问到的问题
  3. Katalon Studio之swagger中的API导入
  4. SVN mime-type 笔记
  5. 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef
  6. K8S Learning(4)——Namespace
  7. java 实现excel 导出功能
  8. potplayer 多个进程_进程组、会话、控制终端概念,如何创建守护进程?
  9. ccie计算机网络英语,最新版CCIE Voice 语音方向 WOLF实验全套语音课程(含版本)...
  10. 【报告分享】2021年社区团购研究报告.pdf(附下载链接)
  11. LeetCode(1029)——两地调度(JavaScript)
  12. java 多态 重载的区别_重写、覆盖、重载、多态几个概念的区别分析
  13. 吴恩达神经网络和深度学习-学习笔记-24-在不同的划分上进行训练和测试+不匹配数据划分的偏差和方差
  14. Python 内置函数介绍
  15. 场景法、流程分析法、错误推断法
  16. RSSHub让万物皆可RSS
  17. 我设计的五笔日本语输入法和韩语输入法初稿图
  18. 机器人设计的步骤有哪些
  19. 互联网创业公司的一段经历
  20. 程序员就是这样聊天把女朋友聊没的。。。

热门文章

  1. 华为笔记本适合计算机专业吗,华为的笔记本电脑怎么样?使用感觉可还好?
  2. java基于jsp的零食商城
  3. Java郭克华课堂笔记
  4. iOS WebCore的wak目录
  5. 2019年端午节书法作品集
  6. 双十一邮件各大商家都是怎么玩儿的
  7. 【TgM阅读笔记】《微信小程序开发——从入门到实战》(陈云贵、高旭)
  8. 对不起!你的程序员同事抛弃你时,可没空和你说再见。
  9. uni-app商城中的搜索功能
  10. 深入浅出OOD(一)