java反射机制并实现任意对象转JSON格式

目录

java反射机制

获取构造方法

获取属性

获取成员方法

使用反射机制将对象转为JSON形式


java反射机制

              在运行状态中,任意一个类,都可以知道它的任意属性和方法,任意一个对象,都可以调用它的任意一个方法和属性。

获取反射机制的三种方法

       1. 对象获取:

        //通过对象获取Class对象User user = new User();Class c1 = user.getClass();

        2.类名获取:

        //通过类名获取Class对象Class c2 = User.class;

      3. 类路径获取:

        //通过Class获取Class对象Class c3 = Class.forName("com.yyds.javaReflect.model.User");

获取构造方法

        1.首先获取Class对象:

        //通过对象获取Class对象User user = new User();Class c1 = user.getClass();

        2.获取无参构造放方法,创建对象 

        //获取无参构造放方法Constructor constructor1 = c1.getConstructor();//创建对象Object user1 = constructor1.newInstance();

        3.获取有参构造放方法,创建对象 

getConstructor参数为:参数的Class对象

        //获取有参构造放方法Constructor constructor2 = c1.getConstructor(int.class,String.class);//创建对象Object user2 = constructor2.newInstance(11,"张三");

       4. 获取私有无参构造方法

setAccessible(true)会取消java语言访问检查,允许访问私有的成员

        //获取Class对象Class c2 = Car.class;// 获取私有无参构造方法Constructor constructor3 = c2.getDeclaredConstructor();//setAccessible为true时:取消java语言访问检查constructor3.setAccessible(true);//创建对象Object user3 = constructor3.newInstance();

获取属性

       1. 获取公共属性:

        Class c2 = Car.class;//获取所有公共的属性Field[] fields = c2.getFields();for(Field f:fields){//输出属性名称System.out.println(f.getName());}//输出公共属性的数目System.out.println(fields.length);

        2.获取私有属性:

 getDeclaredField()和getDeclaredFields()获取私有属性

        //获取指定属性名(包含私有)Field num = c2.getDeclaredField("num");num.setAccessible(true);System.out.println(num.getName());

模拟mybatis反射: 

        //模拟mybatis反射Map<String,Object> map = new HashMap<>();map.put("num",12);map.put("colour","黑色");map.put("id",1);Object car = c2.newInstance();//获取所有属性,包括私有Field[] fields2 = c2.getDeclaredFields();System.out.println(fields.length);for(Field f:fields2){f.setAccessible(true);f.set(car,map.get(f.getName()));}System.out.println(car);

 输出:Car{num=12, colour='黑色', id=1}

获取成员方法

与获取属性方法相似

        1.获取公共成员方法:

  • getMethod(String name, Class<?>... parameterTypes):返回一个 Method 对象,返回类或接口的指定公共成员方法;
  • getMethods():返回Method 数组,返回所有类或接口的指定公共成员方法。

        2.获取私有成员方法:

  • getDeclaredMethods():返回Method 数组,类或接口的所有指定成员、方法,包含私有;
  • getDeclaredMethod()方法:返回指定所有方法,包含私有,有参时,第一个参数为方法名,第二个位方法参数的Class对象。

invoke(对象,参数):调用方法

示例:

        Class c2 = Car.class;Method[] methods = c2.getDeclaredMethods();for (Method m : methods) {System.out.println(m.getName());}Object car = c2.newInstance();Method m1 = c2.getDeclaredMethod("setNum", int.class);m1.invoke(car, 12);System.out.println(car);

使用反射机制将对象转为JSON形式

public class ObjectToJson {public static String objectToJson(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {//    获取所有属性Class c = object.getClass();//获取所有属性Field[] fields = c.getDeclaredFields();String res = "{";for (Field f:fields){//取消java语言访问检查,允许访问私有的属性f.setAccessible(true);res= res + f.getName() +":"+ c.getDeclaredMethod(getGetMethod(f.getName())).invoke(object)+",";}res = res.substring(0,res.length()-1)+"}";return res;}//已知属性名返回get、set形式方法名public static String getGetMethod(String fname){return "get"+fname.substring(0,1).toUpperCase()+fname.substring(1);}public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {Car car = new Car(101,"red",1);User user = new User(1,"tom",12);String jcar = objectToJson(car);String juser = objectToJson(user);System.out.println(jcar);System.out.println(juser);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ工作模式-发布订阅模式

Publish/Subscribe&#xff08;发布订阅模式&#xff09; 官方文档&#xff1a; https://www.rabbitmq.com/tutorials/tutorial-three-python.html 使用fanout类型类型的交换器&#xff0c;routingKey忽略。每个消费者定义生成一个队列关绑定到同一个Exchange&#xff0c;每个…

性能测试jmeter连接数据库jdbc(sql server举例)

一、下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能&#xff0c;所以我们需要借助第三方的工具包来实现。 &#xff08;有这个jar包之后&#xff0c;jmeter可以发起jdbc请求&#xff0c;没有这个jar包&#xff0c;也有jdbc取样器&#xff0c;但不能发…

音视频 fmpeg命令裁剪和合并视频

一、生成测试文件 找三个不同的视频每个视频截取10秒内容 ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4 ffmpeg -i 复仇者联盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4 ffmpeg -i 红海行动.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4如果音视频格式不统一…

如果只发布terraform的部分功能,我们该怎么发布

如果你想在一个较大的 Terraform 配置中只发布其中的一部分功能&#xff0c;你可以考虑以下几种方法来实现&#xff1a; 使用 Workspaces&#xff1a; Terraform Workspaces 是一种将同一个配置文件拆分为多个环境的方式。你可以为不同的功能创建不同的 Workspace&#xff0c;然…

外观模式:简化复杂子系统的访问与使用

文章目录 1. 简介2. 外观模式的基本结构3. 外观模式的实现步骤4. 外观模式的应用与实例4.1 图形界面库的外观模式应用4.2 文件压缩与解压缩的外观模式应用4.3 订单处理系统的外观模式应用 5. 外观模式的优缺点5.1 优点5.2 缺点 6. 总结 1. 简介 外观模式是一种结构型设计模式&…

CentOS 7 上安装 Oracle 11g 数据库

本博客将向您介绍在 CentOS 7 操作系统上安装 Oracle 11g 数据库的步骤&#xff0c;以及在 Oracle 数据库中创建表空间和用户的脚本。 1. 安装必要的软件和依赖 首先&#xff0c;我们需要安装一些必要的软件和依赖项。在终端中执行以下命令&#xff1a; yum -y install xorg…

Linux服务器安装部署MongoDB数据库 – 【无公网IP远程连接】

文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 前言 MongoDB是一个基于分布式文件存储的数据库。由 C 语言编写&#xff0c;旨在为 WEB 应用提供可扩展的高…

什么是OLAP

一、什么是OLAP OLAP&#xff08;On-line Analytical Processing&#xff0c;联机分析处理&#xff09;是在基于数据仓库多维模型的基础上实现的面向分析的各类操作的集合。可以比较下其与传统的OLTP&#xff08;On-line Transaction Processing&#xff0c;联机事务处理&…

Redisson分布式锁 原理源码 分析

# 基于setnx实现的分布式锁存在的问题&#xff1a; # 为了解决上面的问题&#xff0c;可以用Redisson # Redisson入门 # Redisson可重入锁原理 获取锁的Lua脚本&#xff1a; 释放锁的Lua脚本&#xff1a; # 锁重试原理分析 tryLock&#xff08;&#xff09;底层代码分析 tim…

什么是自动语音识别?

在人工智能发展和全球疫情的双重作用下&#xff0c;企业加强了与客户的线上沟通。企业越发依赖于虚拟助手、聊天机器人以及其他的语音技术&#xff0c;以实现与客户的高效互动。这几类人工智能&#xff0c;都是依赖于自动语音识别技术&#xff0c;简称为ASR。ASR涉及到将语音转…

Gson与FastJson详解

Gson与FastJson详解 Java与JSON 做什么? 将Java中的对象 快速的转换为 JSON格式的字符串. 将JSON格式的字符串, 转换为Java的对象. Gson 将对象转换为JSON字符串 转换JSON字符串的步骤: 引入JAR包 在需要转换JSON字符串的位置编写如下代码即可: String json new Gs…

python安装playwright问题记录

python安装playwright这个时候,有得时候会https timeout 有的时候会 not found。 我最后使用的方法三&#xff0c;挺好用的。 PyPI The Python Package Index 可以尝试使用的方法 1. 更换pip源&#xff1a;使用国内的pip源可以提高下载速度并减少超时问题。例如&#xff0c…

【PHP】PHP的面向对象编程

PHP面向对象编程是PHP编程的一个重要方向&#xff0c;它通过将数据和操作封装在对象中&#xff0c;使得代码更加模块化、可重用性和易于维护。本文将介绍PHP面向对象编程的基本概念、核心思想和常见应用&#xff0c;并探讨使用PHP面向对象编程时需要注意的问题。 一、概述 PH…

LLM推理部署(一):LLM七种推理服务框架总结

自从ChatGPT发布以来&#xff0c;国内外的开源大模型如雨后春笋般成长&#xff0c;但是对于很多企业和个人从头训练预训练模型不太现实&#xff0c;即使微调开源大模型也捉襟见肘&#xff0c;那么直接部署这些开源大模型服务于企业业务将会有很大的前景&#xff0c;本文将介绍七…

Effective C++条款16——成对使用new和delete时要采取相同形式(资源管理)

以下动作有什么错? std::string* stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序。使用了new&#xff0c;也搭配了对应的 delete。但还是有某样东西完全错误:你的程序行为不明确&#xff08;未有定义&#xff09;。最低限度&#xff…

PHP竞赛管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 竞赛管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88244066 二、功能介绍 后…

Spring Boot Dubbo Zookeeper(含ZK安装脚本)

文章目录 Spring Boot Dubbo Zookeeper&#xff08;含ZK安装脚本&#xff09;简介DubboCommonProviderConsumer Zookeeper Spring Boot Dubbo Zookeeper&#xff08;含ZK安装脚本&#xff09; 简介 Dubbo Common 公共依赖 <!-- Spring Boot Starter --> <dependen…

C#_特性反射详解

特性是什么&#xff1f; 为程序元素额外添加声明信息的一种方式。 字面理解&#xff1a;相当于把额外信息写在干胶标签上&#xff0c;然后将其贴在程序集上。 反射是什么&#xff1f; 反射是一种能力&#xff0c;运行时获取程序集中的元数据。 字面理解&#xff1a;程序运行…

一键实现 Oracle 数据整库同步至 Apache Doris

在实时数据仓库建设或迁移的过程中&#xff0c;用户必须考虑如何高效便捷将关系数据库数据同步到实时数仓中来&#xff0c;Apache Doris 用户也面临这样的挑战。而对于从 Oracle 到 Doris 的数据同步&#xff0c;通常会用到以下两种常见的同步方式&#xff1a; OGG/XStream/Lo…

事务管理-事务进阶-propagation属性

目录 事务属性-传播行为 propagation 案例 需求 步骤 具体代码 小结 事务属性-传播行为 propagation 事务传播行为&#xff1a;指的就是当一个事务方法被另一个事务方法调用时&#xff0c;这个事务方法应该如何进行事务控制。即如果事务方法A中调用了事务方法B&#xff0c…