Spring学习记录---回顾反射机制

news2024/11/24 11:47:13

目录

10.回顾反射机制

10.1 分析方法四要素

//不使用反射机制调用这些方法

使用反射机制调用方法

代码:

运行结果:

 10.4 假设你知道属性名

测试代码

运行结果


10.回顾反射机制

10.1 分析方法四要素

package com.dong.reflect;

public class SomeService {
    public void doSome(){
        System.out.println("public void doSome() 执行!!");
    }
    public String doSome(String s){
        System.out.println("public String doSome() 执行!!");
        return s;
    }
    public String doSome(String s,int i){
        System.out.println(" public String doSome(String s,int i) 执行!!");
        return s+i;
    }
}
  • //不使用反射机制调用这些方法

package com.dong.reflect;

public class Test {
    public static void main(String[] args) {

        //不使用反射机制调用这些方法
        SomeService someService=new SomeService();
        someService.doSome();
        /**
         * 调用一个方法,一般涉及到4个要素:
         * ● 调用哪个对象的(someService)
         * ● 哪个方法(doSome)
         * ● 传什么参数(**)
         * ● 返回什么值(*)
         * 总结:调用哪个对象的哪个方法、传什么参数、返回什么值。
         *
         * 即使使用反射机制调用方法,也需要具备上述4个要素
         */
        String s1 = someService.doSome("张三");
        System.out.println(s1);
        String s2 = someService.doSome("李四", 180);
        System.out.println(s2);

    }
}
/**
 * 调用一个方法,一般涉及到4个要素:
 * ● 调用哪个对象的(someService)
 * ● 哪个方法(doSome)
 * ● 传什么参数(**)
 * ● 返回什么值(*)
 * 总结:调用哪个对象的哪个方法、传什么参数、返回什么值。
 *
 * 即使使用反射机制调用方法,也需要具备上述4个要素
 */
  • 使用反射机制调用方法

    • 代码:

package com.dong.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Test2 {
    public static void main(String[] args) throws Exception {
        //使用反射机制调用方法
          //先获取类
        Class<?> clazz = Class.forName("com.dong.reflect.SomeService");

        //获取方法
        Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);
        //调用方法
        //四要素:调用哪个对象、哪个方法、传什么参数、返回什么值。
                 // obj 要素:哪个对象
                // doSomeMethod 要素:哪个方法
                // "李四身高:", 180 要素:传什么参数
                // retValue 要素:返回什么值
        Object obj = clazz.newInstance();
        /*
         *          'newInstance()' 已弃用--->用以下方式创建对象:
         *         Constructor<?> con = clazz.getDeclaredConstructor();
         *         Object obj = con.newInstance();
         */
        Object retValue = doSomeMethod.invoke(obj, "李四身高:", 180);
        System.out.println(retValue);
    }
}
    • 运行结果:

  • 小练习
    • 代码
package com.dong.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Test3 {
    public static void main(String[] args) throws Exception{
        //测试  用反射机制调用doSome()没有参数的方法

        //获取类
        Class<?> clazz = Class.forName("com.dong.reflect.SomeService");
        //获取方法
        Method doSomeMethod = clazz.getDeclaredMethod("doSome");
        //调用方法
        Constructor<?> con = clazz.getDeclaredConstructor();
        Object obj = con.newInstance();
        doSomeMethod.invoke(obj);
    }
}
  • 运行结果 


 10.4 假设你知道属性名

假设有这样一个类:

package com.dong.reflect;

public class User {
    private String name;
    private int age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

你知道以下这几条信息:

  • 类名是:com.powernode.reflect.User
  • 该类中有String类型的name属性和int类型的age属性。
  • 另外你也知道该类的设计符合javabean规范。(也就是说属性私有化,对外提供setter和getter方法)

你如何通过反射机制给User对象的name属性赋值zhangsan,给age属性赋值30岁。

  • 测试代码

v-1.0

package com.dong.reflect;

import java.lang.reflect.Method;

public class Test4 {
    public static void main(String[] args) throws Exception{
        /*
           需求:
              假设你现在知道一下信息:
                1、有这样一个类:类名叫:com.dong.reflect.User
                2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法
                3、你还知道这个类当中有一个属性,属性名叫:age
                4、并且你还知道age的属性类型为int类型
             请用反射机制调用相关方法,给user对象的age属性赋值
         */

        String className="com.dong.reflect.User";
        String propertyName="age";

        //通过反射机制调用setAge(int)方法
          //获取类
        Class<?> clazz = Class.forName(className);

         //获取方法
           //先根据属性名获取方法名
              // [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAge
        String setMethodName="set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);

        Method setMethod = clazz.getDeclaredMethod(setMethodName, int.class);

        //调用方法
        Object obj = clazz.newInstance();
        setMethod.invoke(obj, 30);
        System.out.println(obj);
    }
}

v-2.0  让属性类型动态获取---根据属性名获取属性类型

      //根据属性名获取属性类型---clazzField 是一个 Field 对象,它代表了 clazz 类中的名为 propertyName 的属性

Field clazzField = clazz.getDeclaredField(propertyName);

//这段代码是通过反射机制获取一个类(clazz)中指定属性(propertyName)的Field对象(clazzField)。它使用了Java中的getDeclaredField方法,该方法可以获取类中声明的所有字段,包括私有字段。通过这段代码,可以动态地获取和操作类中的属性。

Method setMethod = clazz.getDeclaredMethod(setMethodName,clazzField.getType());
package com.dong.reflect;

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

public class Test4 {
    public static void main(String[] args) throws Exception{
        /*
           需求:
              假设你现在知道一下信息:
                1、有这样一个类:类名叫:com.dong.reflect.User
                2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法
                3、你还知道这个类当中有一个属性,属性名叫:age
                4、并且你还知道age的属性类型为int类型
             请用反射机制调用相关方法,给user对象的age属性赋值
         */

        String className="com.dong.reflect.User";
        String propertyName="age";

        //通过反射机制调用setAge(int)方法
          //获取类
        Class<?> clazz = Class.forName(className);

         //获取方法
           //先根据属性名获取方法名
              // [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAge
        String setMethodName="set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);
              //根据属性名获取属性类型
        Field clazzField = clazz.getDeclaredField(propertyName);

        Method setMethod = clazz.getDeclaredMethod(setMethodName,clazzField.getType());

        //调用方法
        Object obj = clazz.newInstance();
        setMethod.invoke(obj, 30);
        System.out.println(obj);
    }
}
  • 运行结果

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

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

相关文章

深入学习 Redis - 深挖经典数据类型之 string

目录 前言 一、string 类型 1.1、操作命令 set / get &#xff08;设置 / 获取&#xff09; mset / mget&#xff08;批量 > 设置 / 获取&#xff09; setnx / setex / psetex &#xff08;设置时指定不同方式&#xff09; incr / incrby / decr / decrby/ incrbyfloat…

GAMES101作业2

文章目录 作业内容Step 1. 创建三角形的2维bounding boxStep 2. 判断bBox中的像素中心点是否在三角形内Step 3. 比较插值深度和Depth BufferMSAA 作业内容 在屏幕上画出一个实心三角形&#xff0c; 换言之&#xff0c;栅格化一个三角形。上一次作业中&#xff0c;在视口变化之…

P1403 [AHOI2005] 约数研究

题目描述 科学家们在 Samuel 星球上的探险得到了丰富的能源储备&#xff0c;这使得空间站中大型计算机 Samuel II 的长时间运算成为了可能。由于在去年一年的辛苦工作取得了不错的成绩&#xff0c;小联被允许用 Samuel II 进行数学研究。 小联最近在研究和约数有关的问题&…

Vue+axios 使用CancelToken多次发送请求取消前面所有正在pendding的请求

需求&#xff1a; 项目中 折线图数据是循环调用的&#xff0c;此时勾选一个设备&#xff0c; 会出现多条线。 原因 折线图数据一进来接口循环在调用&#xff0c;勾选设备时&#xff0c;循环调用的接口有的处于pedding状态 &#xff0c;有的还在加载中&#xff0c;这就导致勾…

安泰电子:ATA-ML100水声功率放大器模块技术参数

随着人类对海洋的深度探索和利用的不断加深&#xff0c;水下通信技术日益成为研究的热点。水下通信技术是指在海洋、湖泊等水体中实现信息传递和交流的技术手段。它不仅在海洋资源勘探、海洋环境监测等领域具有广泛应用&#xff0c;还在水下考古、水下工程等领域发挥着重要作用…

018 - STM32学习笔记 - SPI读写FLASH(三)- 写入字符串、小数与整数

018 - STM32学习笔记 - SPI访问Flash&#xff08;三&#xff09;- 写入字符串、小数与整数 上节对Flash的跨页写入数据进行了完善&#xff0c;但是数据写入都是以Byte数组的方式进行写入&#xff0c;这节分别进行字符串的写入和小数整数的写入&#xff0c;本节内容对SPI的函数…

linux之Ubuntu系列(四)用户管理 用户和权限 chmod 超级用户root, R、W、X、T、S 软链接和硬链接

r(Read&#xff0c;读取)&#xff1a;对文件而言&#xff0c;具有读取文件内容的权限&#xff1b;对目录来说&#xff0c;具有浏览目 录的权限。 w(Write,写入)&#xff1a;对文件而言&#xff0c;具有新增、修改文件内容的权限&#xff1b;对目录来说&#xff0c;具有删除、移…

Burp Suite---渗透测试工具

文章目录 Burp SuiteBurp Suite入门设置代理HTTP的代理 Proxy&#xff08;代理&#xff09; Burp Suite 是一款集成化的渗透测试工具&#xff0c;包含了很多功能&#xff0c;可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。 Burp Suite由Java语言编写&#xff0c;基于…

十大网络安全上市公司分析,让我们重点聊聊F5

网络安全上市厂商业务广泛分布于网络安全硬件、软件&#xff0c;网络安全服务等板块&#xff0c;总体来看&#xff0c;十大网络安全上市公司的竞争可谓是如火如荼。今天让我们把目光集中在F5&#xff0c;这个能为我们所有人创造更安全的数字世界的企业&#xff0c;在应用及API交…

PuTTY下载(免安装exe)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

手写数字识别Minst(CNN)

文章目录 手写数字识别网络结构加载数据集数据集可视化CNN网络结构训练模型保存模型和加载模型测试模型 手写数字识别 网络结构 网上给出的基本网络结构&#xff1a; 然而在本数据集中&#xff0c;输入图不是1*32*32&#xff0c;是1*28*28。所以正确的网络结构应该是 level…

实现关注公众号以后自动推送小程序

准备好小程序的APPID和跳转路径 然后一行代码搞定&#xff1a; <a data-miniprogram-appid"小程序APPID" data-miniprogram-path"跳转路径">点我跳转到小程序</a>

Shuffle简单理解

map的结果本身是无序的&#xff0c;但是map输出的结果有序 mapper和reduce是不同的机器&#xff0c;进行了网络传输&#xff0c;所以存在数据拷贝 第二次排序&#xff0c;是将每个reduce对应的task进行排序&#xff0c;然后再进入reduce maptask运行结束&#xff0c;每个mask块…

被字节拷打了~基础还是太重要了...

今天分享一篇一位同学去字节面试的实习面经&#xff0c;技术栈是java&#xff0c;投了go后端岗位&#xff0c;主要拷打了 redismysql网络系统java算法&#xff0c;面试问题主要集中在 mysql、redis、网络这三部门&#xff0c;因为面试官是搞 go 的&#xff0c;java 只是随便问了…

55 # 实现可写流

先在 LinkedList.js 给链表添加一个移除方法 class Node {constructor(element, next) {this.element element;this.next next;} }class LinkedList {constructor() {this.head null; // 链表的头this.size 0; // 链表长度}// 可以直接在尾部添加内容&#xff0c;或者根据…

数据库小白看这里,这个Oracle数据库知识图谱你值得拥有

2022年前后&#xff0c;墨天轮社区曾陆续推出PostgreSQL知识图谱、MySQL知识图谱&#xff0c;并得到了大家的广泛好评。此后&#xff0c;便有众多朋友对Oracle知识图谱发起不断“催更“。经过近期的内容搜集整合、专家复审与打磨&#xff0c;墨天轮社区正式推出Oracle知识图谱&…

MySQL五种约束类型(普通 /自增主键,外键等) + 进阶查询(聚合查询,内 /外连接查询,自连接查询,子查询,合并查询)

文章目录 前言一、五种约束NOT NULL 约束UNIQUE 约束DEFAULT 约束PRIMARY KEY 主键约束(重点)普通主键自增主键 FOREIGN KEY 外键约束(重点) 二、进阶查询聚合查询聚合函数GROUP BY子句HAVING 联合查询笛卡尔积内连接外连接自连接子查询单行子查询&#xff1a;返回一行记录的子…

AI时代图像安全“黑科技”如何助力人工智能与科技发展?

〇、前言 7月7日下午&#xff0c;2023世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代AIGC新浪潮—可信AI”论坛在上海世博中心红厅举行。人工智能等技术前沿领域的著名专家与学者、投资人和领军创业者汇聚一堂&#xff0c;共同探索中国科技创新的驱动力量。 在…

搭载下一代人工智能技术,微软推出Power Automate流程挖掘产品

在近日的Microsoft Inspire大会中&#xff0c;微软揭晓了他们即将推出的Power Automate流程挖掘产品&#xff0c;并计划在8月1日正式对外开放。 试用地址&#xff1a;https://powerautomate.microsoft.com/zh-cn/#home-signup 这款产品搭载了下一代人工智能技术&#xff0c;有…

好用的思维导图软件有哪些?这几款简单好用

好用的思维导图软件有哪些&#xff1f;思维导图是一种非常有用的思维工具&#xff0c;可以帮助我们组织和理清复杂的信息。在如今的数字时代&#xff0c;有很多软件可以帮助我们创建和编辑思维导图。下面介绍几款简单好用的思维导图软件。 第一款&#xff1a;迅捷画图 这是一款…