反射(重点)

1.反射的概述

Java给我们提供了一套API,使用这套API我们可以在运行时动态的获取指定对象所属的类,创建

运行时类的对象,调用指定的结构,(属性,方法)等

API:

  • java.lang.Class:代表一个类

  • java.lang.reflect.Method:代表类的方法

  • java.lang.reflect.Field:代表类的成员变量

  • java.lang.reflect.Constructor:代表类的构造器

  • 反射的优点:提高Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力。

  •      允许创建和控制任意类对象,无需提前硬编码目标类

  •     缺点:

  •           反射的性能低

  •           反射机制主要在对灵活性和扩展性要求很高的系统框架上。

  •           放射会模糊内部逻辑,可读性较差。

  •           反射,在日常开发中使用不多,主要是底层框架的使用

  • 2.class:反射的源头

  • class类的理解(掌握)
  • 针对于编写好的.java源文件进行编译(使用javac.exe),会生成一个或多个.class字节码文件。接着,我们使用java.exe命令对指定的.class文件进行解释运行。这个解释运行的过程中,我们需要将.class字节码文件加载(使用类的加载器)到内存中(存放在方法区)。加载到内存中的.class文件对应的结构即为Class的一个实例。
  • 获取类实例的几种方式(前三种)
  • 类.class
  • 对象.getclass
  • (使用较多) class调用静态方法forName(String className);这里的String classname 是类的全类名
  • (了解)使用classLoader的方式loadclass(String className)
  •  

  • Class可以指向那些结构
  •    class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
  •    注解
  •    接口
  •    [ ]数组
  •    enum:枚举
  •    基本数据类型
  •     void
  • 3.类的加载过程
  •  过程1类的装载(loading):
  •   将类的Class读入文件,并为之创建一个java.lang.Class对象。此过程由类加载器完成

    过程2:链接(LInking)

 > 验证:(Verify)确保信息符合jvm规范,列如,符合cafebabe开头,没有安全问题

> 准备:(Prepare)为静态(static)分配内存并设置默认初始值的过程

> 解析(Resolve):虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程

过程3:初始化(initialization)

  • 执行类构造器<clinit>()方法的过程。
    类构造器<clinit>()方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。

4.反射的应用1:创建运行时类的对象(重点)

             Class  clazz= person.class

               person per =(preson)clazz.newInstance();

              System.out.println(per);

 条件: 要想创建对象成功,需要满足:
条件1:要求运行时类中必须提供一个空参的构造器
条件2:要 求 提 供的空参的构造器的权限要足够。

5.反射的应用2:获取运行时类的所有结构

(了解)获取运行时类的的内部结构:所有属性,所有方法,所有构造器

另一种方法,也是一样的,这里的forName()是静态方法

(熟悉) 获取运行时类的内部结构2:父类,接口们,包,带泛型的父类,父类的泛型等

6.反射的应用3;调用指定的结构(重点)

3.1 调用指定的属性(步骤)
步骤1.通过Class实例调用getDeclaredField(String fieldName),获取运行时类指定名的属性


步骤2. setAccessible(true):确保此属性是可以访问的


步骤3. 通过Filed类的实例调用get(Object obj) (获取的操作) 或 set(Object obj,Object value) (设置的操作)进行操作。

调用普通属性(任何权限)

调用静态属性:静态不需要对象去调,所以这里不用创建对象,用类.class去调。

3.2 调用指定的方法(步骤)
步骤1.通过Class的实例调用getDeclaredMethod(String methodName,Class ... args),获取指定的方法


步骤2. setAccessible(true):确保此方法是可访问的


步骤3.通过Method实例调用invoke(Object obj,Object ... objs),即为对Method对应的方法的调用。
     invoke()的返回值即为Method对应的方法的返回值


     特别的:如果Method对应的方法的返回值类型为void,则invoke()返回值为null

普通方法:

静态方法;这里的返回值是void,所有最后直接null,如果不是void,那就可以用类.class

3.3 调用指定的构造器(步骤)
步骤1.通过Class的实例调用getDeclaredConstructor(Class ... args),获取指定参数类型的构造器
步骤2.setAccessible(true):确保此构造器是可以访问的
步骤3.通过Constructor实例调用newInstance(Object ... objs),返回一个运行时类的实例。

//有参构造

无参构造

7体会反射的动态性

public class ReflectTest {

    //体会:静态性
    public Person getInstance(){
        return new Person();
    }

    //体会:反射的动态性
    //举例1:
    public <T> T getInstance(String className) throws Exception {

        Class clazz = Class.forName(className);

        Constructor con = clazz.getDeclaredConstructor();
        con.setAccessible(true);

        return (T) con.newInstance();

    }

    @Test
    public void test1() throws Exception {
        Person p1 = getInstance();
        System.out.println(p1);

        String className = "com.atguigu04.other.dynamic.Person";
        Person per1 = getInstance(className);
        System.out.println(per1);

        String className1 = "java.util.Date";
        Date date1 = getInstance(className1);
        System.out.println(date1);
    }

    //体会:反射的动态性
    //举例2:
    public Object invoke(String className,String methodName) throws Exception {
        //1. 创建全类名对应的运行时类的对象
        Class clazz = Class.forName(className);

        Constructor con = clazz.getDeclaredConstructor();
        con.setAccessible(true);

        Object obj = con.newInstance();

        //2. 获取运行时类中指定的方法,并调用
        Method method = clazz.getDeclaredMethod(methodName);
        method.setAccessible(true);
        return method.invoke(obj);
    }

    @Test
    public void test2() throws Exception {
        String className = "com.atguigu04.other.dynamic.Person";
        String methodName = "show";

        Object returnValue = invoke(className,methodName);
        System.out.println(returnValue);
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

游戏力:竞技游戏设计实战教程

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 游戏力&#xff1a;竞技游戏设计实战教程 引言…

高中数学:单调奇偶综合(较难)

一、奇偶性扩展 1、普通轴对称函数 要会根据抽象函数的关系&#xff0c;找出对称轴 简便记法&#xff1a;纵相等&#xff0c;对称轴 2、普通中心对称函数 要会找出对称中心点坐标 简便记法&#xff1a;纵和定&#xff0c;中心点 二、题型汇总 解题方法 抽象函数 1、…

社交媒体革新者:揭秘Facebook对在线互动的影响

1. Facebook的兴起与发展 Facebook由马克扎克伯格在哈佛大学宿舍创建&#xff0c;最初只是服务于哈佛大学学生的社交网络。然而&#xff0c;其后快速扩张到其他大学和全球&#xff0c;成为了全球最大的社交媒体平台之一。其发展历程不仅是数字时代的典范&#xff0c;也是创业成…

史上最大优惠!阿里云宣布全线降价99元一年,新老客户同享

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

证件照制作繁琐?学会这三招轻松制作专业级证件照!

朋友们&#xff0c;您是否曾经为了办理各种证件、报名考试或者求职简历中的证件照而烦恼呢&#xff1f;是否希望能在家就能便捷高效地制作出符合规格的专业证件照&#xff1f;今天我将为大家推荐三款国内外备受好评的证件照处理工具&#xff0c;让您随时随地拥有完美证件照&…

AI领域再出“王炸“----Claude3是否会成为下一个“神“

目录 一.Claude3最新发布 二.Claude3支持20万token 三.Claude3在未公开算法上取得重大突破 1.Claude 3读懂博士论文 2.量子跃迁集成&#xff1a; Claude 3智商&#xff1a;101 测试方法 测试细节 通过Karpathy挑战 Claude 3自画像&#xff0c;突破本我 从洛杉矶排到…

蚂蚁感冒c++

题目 思路 “两蚂蚁碰面会掉头&#xff0c;若其中一只蚂蚁感冒了&#xff0c;会把感冒传染给碰到的蚂蚁”&#xff0c;这句话看作是“两蚂蚁碰面会互相穿过&#xff0c;只是把感冒的状态传给了另一只蚂蚁”&#xff0c;因为哪只蚂蚁感冒了并不是题目的重点&#xff0c;重点是有…

浅谈块存储、文件存储、对象存储

**块存储、文件存储和对象存储各自有其独特的特点和适用场景**。具体来说&#xff1a; 1. **块存储**&#xff1a; - 描述&#xff1a;块存储将存储空间分割成固定大小的块&#xff0c;这些块可以直接映射到主机操作系统。它提供的是原始的存储空间&#xff0c;不带文件系统…

Jmeter接口测试参数化

一、前言 接口测试组合不同的参数向服务器发送请求&#xff0c;接受和解析响应结果&#xff0c;通过测试数据的交换逻辑来验证服务端程序工作的正确性。 我们在测试过程中需要考虑不同的输入组合&#xff0c;来覆盖不同的测试范围&#xff1b;除此之外&#xff0c;系统中往往…

Cluade3干货:超越GPT,模型特点分析+使用教程|2024年3月更新

就在刚刚&#xff0c;Claude 发布了最新的大模型 Claude3&#xff0c;并且一次性发布了三个模型&#xff0c;分别是 Claude 3 Haiku&#xff1a;&#xff08;日本俳句 &#xff09;Claude 3 Sonnet&#xff08;英文十四行诗&#xff09;Claude 3 Opus&#xff08;古典乐作品集…

亚信安慧AntDB的全方位支持力

AntDB以持续创新和技术进步为理念&#xff0c;不断优化性能和功能&#xff0c;至今已经保持了15年的平稳运行。这一漫长的历程并非偶然&#xff0c;而是源于AntDB团队对技术的不懈探索和追求。他们始终秉承着“永不停歇&#xff0c;永不满足”的信念&#xff0c;将技术创新作为…

[Redis]——初识Redis

一、Redis为非关系型数据库 ❓我们常见的MySQL、SQLServer都是关系型数据库&#xff0c;那他们之间有什么区别与联系呢&#xff1f; &#x1f4d5;关系型数据库与非关系型数据库的区别&#xff08;面试题&#xff09; 解释&#xff1a; SQL数据库中的表是有结构的&#xff0c;包…

【小智好书分享• 第二期】《低代码平台开发实践:基于React》

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

ppt做好怎么保存到u盘?简单几步搞定

在日常工作和学习中&#xff0c;PowerPoint&#xff08;简称PPT&#xff09;已成为我们展示和分享内容的重要工具。当我们完成一份精美的PPT后&#xff0c;如何将其安全、便捷地保存到U盘&#xff0c;以便随时随地进行演示或分享&#xff0c;成为了许多用户关心的问题。本文将为…

Rust 安装与版本更新

Rust 简介 Rust &#xff0c;一门赋予每个人构建可靠且高效软件能力的语言&#xff0c;主打内存安全。 2024年2月&#xff0c;在一份 19 页的报告《回归基础构件&#xff1a;通往安全软件之路》中&#xff0c;白宫国家网络主任办公室&#xff08;ONCD&#xff09;呼吁开发者使…

计算机网络:网络层知识点汇总

文章目录 一、网络功能概述二、SDN基本概念三、路由算法与路由协议概述四、IP数据报格式五、IP数据报分片六、IPv4地址七、网络地址转换NAT八、子网划分和子网掩码九、无分类编址CIDR十、ARP协议十一、DHCP协议十二、ICMP协议十三、IPv6十四、RIP协议与距离向量算法十五、OSPF协…

【电路笔记】-双极晶体管

双极晶体管 文章目录 双极晶体管1、概述2、双极晶体管结构3、双极晶体管配置3.1 共基极 (CB) 配置3.2 共发射极 (CE) 配置3.3 共集极 (CC) 配置4、总结1、概述 双极结型晶体管是一种可用于开关或放大的半导体器件。 与半导体二极管不同,半导体二极管由两片半导体材料组成,形…

ubuntu22出现make_ext4fs: command not found

1、下载android-tools-fsutils https://mirrors.cqupt.edu.cn/deepin/pool/main/a/android-tools/ 2、sudo dpkg -i android-tools-fsutils_5.1.1.r38-1.1_amd64.deb 3、sudo apt-get install -f 4、make_ext4fs -h

球盒问题(大雪问题)

说明:本博文来自CSDN-问答板块,题主提问。 需要:球和盒子 设有n个球,m个盒子。将球是否相同,盒子是否相同,是否可以有空盒(有空盒指的是可以有空盒)分为八种情况。写出将球放入盒子的所有情况求法,并选择其中2个,写出相应的程序代码。(用两种语言写),可以使用pyth…

OJ:循环队列

622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a;首先循环队列的意思是&#xff1a;空间固定&#xff0c;就是提前开辟好&#xff0c;满了就不能插入了&#xff0c;但是删除数据后仍有空间&#xff0c;删除循环队列里面的数据后&#xff0c;保…