• Java进阶知识——反射


    文章目录

    一、反射的基本概念

    1、反射的概念

    将类的各个组成部分封装成其他对象,这就是反射的机制.
    在这里插入图片描述
    通过上图,我们可以通过反射获得Person类的Class对象,通过获得Class对象来获得其中的成员变量,构造方法和成员方法,这个也是我们使用反射的目的。

    2、使用反射的好处

    1. 可以在程序的运行过程中操作这些对象,获得类对象的属性,方法等.
    2. 可以解耦,以此来提高程序的可扩展性

    3、补充

    反射:框架设计的灵魂,反射是框架设计的关键点

    那么知道了反射,框架又是什么呢

    框架:半成品软件,我们在开发的过程中可以在框架的基础上使用一些封装好的类进行软件开发,这样就可以简化编码了.

    二、获取Class对象

    1、获取Class对象的方式

    1. Class.forname(“全类名”):将字节码文件加载进内存,返回class对象
    2. 类名.class:通过类名的属性class获取
    3. 对象.getclass():因为getclass()方法在object类中定义,又因为所有类都会继承object类,所以所有类都有这种方法

    2、演示上面三种获取对象的方式

    Person类

    public class Person {
        
    }
    
    • 1
    • 2
    • 3

    Main类

    public class Main {
        public static void main(String[] args) throws Exception {
            Class person = Class.forName("test.Person");
            Class person1 = Person.class;
            Person p = new Person();
            Class person2 = p.getClass();
            System.out.println(person);
            System.out.println(person1);
            System.out.println(person2);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    程序运行结果
    在这里插入图片描述
    结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个

    三、使用class对象功能

    1、class对象具体功能方法介绍

    在这里插入图片描述

    2、具体功能演示

    因为所有的方法使用方式类似,在这里我就只演示获取成员变量的方法了

    Person类

    public class Person {
        public String name;
        private int age;
        public String sex;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Main类

    public class Main {
        public static void main(String[] args) throws Exception {
            Class person = Class.forName("test.Person");
            
            Field[] fields = person.getFields();
            System.out.println("getFields():只能获得公有的属性");
            for(int i = 0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    程序运行结果

    getFields():只能获得公有的属性
    public java.lang.String test.Person.name
    public java.lang.String test.Person.sex
    -----------------------------
    getDeclaredFields():能获得所有的属性
    public java.lang.String test.Person.name
    private int test.Person.age
    public java.lang.String test.Person.sex
    -----------------------------
    getField():获得单个公有属性
    public java.lang.String test.Person.name
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    从一个非科班的角度唠唠我的编程技术学习成长之路,希望对你有帮助
    y150.第八章 Servless和Knative从入门到精通 -- Kafka 与Eventing(十四)
    基于 Redis + Lua 脚本实现分布式锁,确保操作的原子性
    13T搅拌运输车冷却系统改进设计
    游戏社区-搭建的目的和意义是什么
    [CVE-2021-45105] Apache Log4j2 漏洞复现与原理详细分析
    python datetime时间模块
    博客园众包平台:50w+驱动开发大单,全园找人接单
    多线程ThreadLocal详细介绍
    深入理解Kotlin协程
  • 原文地址:https://blog.csdn.net/m0_67390788/article/details/126059423