当前位置: 首页 > news >正文

Java高级-02.反射-认识反射、获取类

一.何为反射

所谓反射,就是加载类,并将类中的各种成分解剖出来,如成员变量、方法、构造器等。然后对这些成员变量、方法、构造器等进行操作。

当我们使用idea时,出现这种提示,如.study()方法的提示就是使用反射解构出来的。

二.反射学什么

三.加载类,获取类的字节码文件

我们首先定义一个Student类,

package com.njau.d2_reflect;

public class Student {
    private String name;
    private  int age;
    private char sex;
    private double height;
    private String hobby;

    public Student(String name, int age, char sex, double height, String hobby) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.height = height;
        this.hobby = hobby;
    }

    public Student() {
    }

    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;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", height=" + height +
                ", hobby='" + hobby + '\'' +
                '}';
    }
}

接着我们通过以上获取Class对象的三种方式来获取Student类的类对象

首先第一种方式是通过类名.class的方式获取:

第二种方式是通过Class.forname(全类名)的方式获取:

第三种方式是通过该类的实现类对象调用.getClass()方法获取。

package com.njau.d2_reflect;

/**
 * 目标:了解反射并掌握获取Class对象的3种方式
 * 反射:
 * 反射就是:加载类,并允许以编程的方式解剖类的各种成分(成员变量、方法、构造器等)
 * 获取Class对象的三种方式
 * 1、Class c1 = 类名.class
 * 2、调用Class提供方法:public static Class forName(String package);
 * 3、Object提供的方法:public Class getClass();   Class c3 = 对象.getClass();
 */
public class Test1Class {
    public static void main(String[] args) throws Exception {
        Class c1 = Student.class;
        System.out.println(c1.getName());   // com.njau.d2_reflect.Student(全类名)
        System.out.println(c1.getSimpleName());  //  Student

        Class c2 = Class.forName("com.njau.d2_reflect.Student");
        System.out.println(c2);   // class com.njau.d2_reflect.Student
        System.out.println(c2==c1);  // true

        Student s = new Student();
        Class c3 = s.getClass();
        System.out.println(c3);   // class com.njau.d2_reflect.Student
        System.out.println(c3 == c2);   // true
    }
}

我们通过验证可以知道获取到的都是同一个Student类对象,因为一个类只能存在一个。

相关文章:

  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-3-从ES 7.x到8.x的平滑迁移策略
  • 如果关闭 CONFIG_MODULE_SIG
  • Visual Studio工具
  • Prosys OPC UA Gateway:实现 OPC Classic 与 OPC UA 无缝连接
  • 微软远程桌面即将下架?Splashtop:更稳、更快、更安全的 RDP 替代方案
  • C++中虚析构函数的作用是什么?为什么基类需要虚析构函数?
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-2-性能调优工具箱
  • BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载
  • 掌握市场先机:9款销售渠道管理工具深度测评
  • Trae插件革命:用VSPlugin Helper实现VSCode市场插件全自动安装
  • Git 本地常见快捷操作
  • OpenAI Agents SDK 中文文档 中文教程 (5)
  • 计算机的物理组成——微机的物理结构
  • 如何用collect_set等函数实现map结构的数据
  • Java面向对象编程进阶:深入理解static、单例模式与继承
  • 以太坊AI代理与PoS升级点燃3月市场热情,2025年能否再创新高?
  • 列表动态列处理
  • 使用 Clang API 编译 C++
  • Flink之水印(watermark)的补充理解
  • Dynamics 365 启用用户安全角色变更的审核功能
  • 德国放弃长期以来的反核立场,寻求修复德法合作关系
  • 三人在共享单车上印小广告被拘,北京警方专项打击非法小广告
  • 全球前瞻|特朗普19日将与俄乌总统分别通话,英国脱欧后首开英欧峰会
  • 以色列媒体:哈马斯愿意释放部分人员换取两个月停火
  • 下辖各区密集“联手”,南京在下一盘什么样的棋?
  • 【社论】城市更新,始终以人为核心