反射机制简单基础

news2024/12/27 14:45:59

前序

在我们没有学习框架之前我们都是通给new来创建对象,如:创建一个我们已知的对象

Car car=new Car();

调用类中的成员变量和成员方法都是对象直接调用。

在学习了mybatis框架后,我们了解到可以通过类名,能动态得到类中定义的信息,包括类中有哪些方法,有哪些属性等

比如在xml映射文件中:

<mapper namespace="com.ffyc.mybatispro.dao.AdminDao"></mapper>

通过这个我们就知道调用的这给类中的接口

以及

 <select id="findAdminByid" parameterType="int" resultType="Admin">
             select * from admin where id =#{id}
</select>

在这里mybatis框架中就会把查询到的数据映射到Admin这个类中,在这里我们就会产生一个疑惑为什么这样呢?

实际上市MyBatis在底层中实现了java反射机制。那什么是java反射机制,下面是一个简单的入门级的介绍。

反射机制概念

在运行状态中,在仅知道一给类名时,就可以动态获得类中信息,创建类对象,调用对象成员的机制就称为Java反射机制。

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

作用:动态获取类的信息

Class类

Java.lang.Class

Class类的对象,表示当前正在运行中的类和接口,Class类是实现java反射的基础

一旦class文件被加载到内存,就会为其创建一个Class对象。任意类使用都会创建Class对象

 

Java反射相关API

Java反射机制的相关类主要有:

Class类,Constructor类 获得构造方法,Method类 获得方法,Field类 获得属性

 获得Class对象

通过全类名获得Class对象(有三种方法)

String classname="com.ffyc.javaReflect.User";

方式一:通过Class类中的属性formname(String classname)(Class类的静态方法)

Class clazz=Class.forName(classname);

方式二:类名.class,适用于通过类名获得Class对象

//方式2
Class clazz2 = User.class;

方式三:Object类中的getClass方法:适用于通过对象获得Class实例的情况

//方式3
User user=new User();
Class clazz3 = user.getClass();

获得相应类的构造方法

有四种方式

Class aClass=Class.forName(classname);

通过Class类中的getConstructor()获得相应类的构造方法

//获得类的构造方法,通过构造方法api中的方法创建对象
  Constructor constructor1 = aClass.getConstructor();//获得指定的公共构造方法

String.class表示:参数是String类型(这里需要什么类型,转换成什么即可)

Constructor constructor2 = aClass.getConstructor(String.class,String.class);//获得有参构造方法

 getConstructors()获得所有公共的构造方法放到Constructor数组中

Constructor [] constructors=aClass.getConstructors();//获得所有公共的构造方法

getDeclaredConstructor()和getDeclaredConstructors()

//虽然可以获得私有构造方法,但是一般不建议操作私有成员,因为打破了封装性
aClass.getDeclaredConstructor();//获得类中任意构造方法,包括私有的
aClass.getDeclaredAnnotations();//获得类中所有构造方法,包括私有的

 获得相应类的方法

有四种方式

参数表示是类方法的名称

Method method = aClass.getMethod(String name)

 其它三个获取类方法的方式

//获得类中所有公共的成员方法,返回值是一个Method类数组
aClass.getMethods();
//获得类中的任意成员方法,包括私有的,返回值是一个Method类
aClass.getDeclaredMethod("eat");
//获得类中所有成员方法,包括私有的,返回值是一个Method类数组
aClass.getDeclaredMethods();

调用方法执行程序,这里的object表示要通过那个对象来调用这个方法

//调用方法使用invoke调用
method.invoke(object );

 获得类的成员变量

有四种方式

方式一

Field accountField= aClass.getField("account");//获得指定名称的公共成员变量

方式二

Field accountField= aClass.getDeclaredField("account");//获得指定名称的成员变量,包含私有的

方式三

Field[] fields= aClass.getDeclaredFields();//获得类中所有的成员变量,包含私有的

方法四

Field[] fields1=aClass.getFields();//获得类中所有公共的成员变量

如果想要操作私有变量,则需要setAccessible(true),改为false则程序报错

f.setAccessible(true);//允许访问操作私有变量

模拟在数据库查询到数据,赋值给对象

 //模拟数据库中查到的数据
 HashMap<String,String> map=new HashMap<>();
 map.put("account","admin");
 map.put("password","111");
Field[] fields= aClass.getDeclaredFields();//获得类中所有的成员变量,包含私有的
 for (Field f:fields){
     f.setAccessible(true);//允许访问操作私有变量
     f.set(object,map.get(f.getName()));
 }
 System.out.println(object);

结果:

为了能够更好的熟悉Java反射机制练习俩个实例

第一个,给私有成员变量赋值,不使用可以操作私有的属性的方法,

package com.ffyc.javaReflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;

public class Test5 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

      

        //使用反射机制时,只知道类的名称(包名+类名)
        
        String classname="com.ffyc.javaReflect.Car";
        //1、通过类名获得类的Class对象
        Class aClass=Class.forName(classname);
        //通过类的Class对象来创建对象
        Object object = aClass.newInstance();
        //通过属性的set、get对私有属性赋值
        HashMap<String,String> map=new HashMap<>();
        map.put("name","奔驰");
        map.put("color","白色");
        //先拿到类中的所有私有属性
     Field[] fields= aClass.getDeclaredFields();
     for (Field field:fields){
         //根据属性名生成set方法名称
         String setMethod ="set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
         System.out.println(setMethod);
         //通过class对象,获得对应的set方法对象
         Method setMethodObj =aClass.getMethod(setMethod,field.getType());
        //调用set方法
         setMethodObj.invoke(object,map.get(field.getName()));
     }
        System.out.println(object);



    }
}

 

第二个是一个简单转为json字符串

package com.ffyc.javaReflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ToJsonUtil {
    public static String toJson(Object object1) throws  IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class aClass=object1.getClass();
         String json="{";
        //获取类中的属性变量
                Field [] fields= aClass.getDeclaredFields();
                for (Field field:fields){
                    String getMethod="get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
                    //拿到get方法
                         Method method = aClass.getMethod(getMethod);
                         //调用get方法
                 String value = (String) method.invoke(object1);
                 json+=field.getName()+":"+value+",";
                }
                json=json.substring(0,json.length()-1);
                json+="}";
        return json;
    }

    public static void main(String[] args) throws  NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        User user=new User();
        user.setAccount("admin");
        user.setPassword("111");
        Car car=new Car("奔驰","白色");
        System.out.println(toJson(user));
        System.out.println(toJson(car));
    }
}

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

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

相关文章

【AI学习】在魔塔社区玩Ollama:部署GLM4和CodeGeeX4

看到文章《Ollama可以玩GLM4和CodeGeeX4了&#xff0c;快来魔搭玩起来》&#xff0c;参考的运行了一遍&#xff0c;折腾了一个晚上加一个上午&#xff0c;终于搞定了。本来很简单的事情&#xff0c;对这个代码小白&#xff0c;还是有点坑。。 GPU要明显快很多&#xff0c;CPU的…

谷歌chrome浏览器显示“版本太旧”又无法更新情况下,如何关闭“Chrome版本太旧”提示,包括直接启动Google浏览器,或者通过其他应用启动

问题描述 由于在无互联网环境使用Google浏览器&#xff0c;所以无法进行升级&#xff0c;但每次启动都会有如下提示&#xff0c;作为有强迫症的我实在无法接受。 解决方案 1、修改属性(通过快捷方式启动有效) 通过右键在快捷方式后添加启动参数 右键“Google Chrome”图标…

C的温故而知新:位操作(C Primer Plus第十五章)

第十五章&#xff1a;位操作 这一章的篇幅不是很长&#xff0c;但既然能单独作为一章来讲的话&#xff0c;应该蛮重要的&#xff0c;但是我貌似没有总结出多少需要注意、加强记忆的东西&#xff0c;可见在JAVA的日常开发过程中基本不太遇见有关位操作的内容&#xff0c;所以我…

一起学Java(9)-[日志篇]教你掌握Java日志框架的演进和设计逻辑

在项目开发中&#xff0c;日志记录&#xff08;Logging&#xff09;扮演着至关重要的角色。日志是开发人员 调试代码和诊断问题的重要工具。例如&#xff1a;在生产环境中&#xff0c;开发人员通常无法直接调试代码&#xff0c;日志提供了一个详细的执行轨迹&#xff0c;帮助开…

一篇初学者入门Python文件的读取与写入

我们探讨了如何使用第三方库来扩展我们的Python程序能力.在这一篇教程中,我们将聚焦于Python中文件的读取与写入操作.文件操作是编程中重要的基础,能够有效地帮助我们保存和读取数据。 如果你对Python感兴趣的话&#xff0c;可以试试我整理的这一份全套的Python学习资料&#x…

建筑项目管理软件市场新风向,10款热门软件解析

1、PingCode PingCode 是一款为研发团队设计的全流程管理软件&#xff0c;连续多年入选中国软件项目管理软件榜单前二&#xff0c;是国内研发管理的热门系统。知名客户包括小红书、长城汽车、清华大学、中国电信等。 主要功能 PingCode 核心能力在于支持软件产品研发全生命周…

比requests还好用的Python高效库,效率提升一倍

Python开发者们最常用的库之一就是requests&#xff0c;它以简单易用的API和强大的功能深受喜爱。然而&#xff0c;随着爬取任务的复杂性增加&#xff0c;requests的局限性逐渐显现。一些更为高效、功能更强大的爬虫库开始进入开发者的视野 那么&#xff0c;有没有比requests更…

西北农林科技大学李毅研究员等人在农学顶刊Agric. Syst.发文:持续的干旱威胁着小麦和玉米生产,并将在未来扩大作物产量差

文章简介 论文名称&#xff1a;Concurrent drought threatens wheat and maize production and will widen crop yield gaps in the future &#xff08;持续的干旱威胁着小麦和玉米生产&#xff0c;并将在未来扩大作物产量差&#xff09; 第一作者及单位&#xff1a;Miaolei …

【EMC专题】以太网电路为什么在变压器次级侧加浪涌保护二极管?

以太网广泛应用于工业领域,会受到诸多恶劣条件的影响。一种特别恶劣的条件是 IEC61000-4-5 中强调的瞬态浪涌。浪涌瞬变对这些系统特别危险,因为这代表有较大功率耦合到以太网物理层的发送和接收电路,可能会损坏以太网控制器或 PHY。 以太网物理层包括以太网 PHY(或控制器)…

vue 实现简单AI聊天程序(一) elementui 聊天框编写

这个系列的目标是开发一个AI聊天前端界面后端问答程序&#xff0c; 探索前端界面开发。 尝试后端对接阿里云千问大模型&#xff0c;后续还会更新自己部署的大模型。 这一期用elmentui来开发一个聊天框的前端&#xff0c;根据用户发送的内容&#xff0c;AI会返回一个一模一样的…

中山大学和联想研究院提出文本到服装生成模型GarmentAligner,解决服装生成中语义对齐、数量、位置和相互关系等问题。

中山大学和联想研究院提出一个能够根据文字描述生成服装图像的智能工具GarmentAligner。它可以从已有服装图像中提取出各个组成部分&#xff0c;并记录下它们的位置和数量。接着根据你的描述进行匹配&#xff0c;找出最吻合的服装组件进行组合。而为了确保生成的图像能够准确反…

Nosql数据库redis集群配置详解

一、Redis的安装 环境介绍&#xff1a; 一主双从&#xff1a;10&#xff08;redis-node1&#xff09;主&#xff0c;20&#xff08;redis-node2&#xff09; 30&#xff08;redis-node3&#xff09;从——使用的是红帽9.1系统 源码安装redis [rootredis-node1 ~]# tar zxf red…

【yarn publish : 报错 passed folder/tarball doesn‘t exist 】

当执行yarn publish 时报错&#xff0c;具体命令类似 yarn publish --new-version ${NEW_VERSION} ${my-node-moudle-path}/my-node-modules 报错内容&#xff0c; 网上搜了一圈&#xff0c;基本没有这个报错的相关内容&#xff0c;最后分析并解决了&#xff0c;这里记录分享下…

NoSql数据库 - Redis Cluster集群详解及案例实现

Redis Cluster集群&#xff08;无中心化设计&#xff09; 1.1 Redis Cluster 工作原理 在哨兵sentinel机制中&#xff0c;可以解决redis高可用问题&#xff0c;即当master故障后可以自动将slave提升为master&#xff0c;从而可以保证redis服务的正常使用&#xff0c;但是无法…

查看exe文件所需要依赖库的方法

Windows 1.dumpbin /dependendsv [file_path]; 2.Qt windeployqt.exe打包 在exe的同一目录下生成需要的文件和库&#xff1b;如果不是qt程序结果如下&#xff1a;

发那科机床设备数据 转IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集发那科机床数据 2 5 用IEC61850协议转发数据 5 6 网关使用多个逻辑设备和逻辑节点的方法 7 7 案例总结 8 1 案例说明 设置网关采集发那科机床数据把采集的数据转成IEC61850协议转发给其他系统。 2 VFBOX网关…

Google Search Console:完整教程

Google 提供了各种工具来收集和分析网站数据&#xff0c;其中最有价值的工具之一是 Google Search Console &#xff08;GSC&#xff09;。前身为 Google Webmaster Tools&#xff0c;它为 SEO 提供了对网站性能的宝贵见解。自 2015 年推出以来&#xff0c;该平台取得了长足的发…

分库分表学习笔记(一)

图源&#xff08;鹅厂技术架构师公众号&#xff09; MySQL执行顺序&#xff1a; FROM&#xff1a;确定数据来源。JOIN&#xff1a;执行表之间的连接操作。WHERE&#xff1a;过滤记录。GROUP BY&#xff1a;对记录进行分组。HAVING&#xff1a;对分组结果进行过滤。SELECT&#…

如何用Java SpringBoot+Vue搭建美容美发管理系统?实战解析

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

47.【C语言】指针(重难点)(J)

目录 26.自制排序函数(★★) *分析 *代码 往期推荐 26.自制排序函数 *分析 之前在42.【C语言】冒泡排序写过一个排序函数&#xff0c;可以将此自制一个类似qsort的函数 画圈的地方是需要修改的 #include <stddef.h> void bubble_sort(void* base, size_t num,size_t w…