Java面试知识点(六十三)Java反射

本文详细介绍了Java反射机制,从概述、获取Class对象的三种方式,到通过反射访问构造函数、成员变量和方法,再到利用反射操作配置文件及绕过泛型检查。通过实例解析了反射在实际开发中的应用。
摘要由CSDN通过智能技术生成

JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
实际上,我们创建的每一个类也都是对象,即类本身是 java.lang.Class 类的实例对象。这个实例对象称之为类对象,也就是 Class 对象。


一、概述

反射就是把 java 类中的各种成分映射成一个个的 Java 对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与 class 对象。
熟悉一下加载的时候:Class 对象的由来是将 class 文件读入内存,并为之创建一个 Class 对象。
在这里插入图片描述

  • Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是 jvm 中有 N 多的实例每个类都有该 Class 对象。(包括基本数据类型)
  • Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM 已经帮我们创建好了。

二、获取class对象的三种方式

  1. 通过object类的 getClass() 函数,由于object是根类,每一个类都有这个函数
  2. 每一个类(包括基本数据类型,注意这里基本数据类型不用转成包装类)都有一个class属性,静态属性,通过类名直接访问
  3. 通过Class类的静态方法 forName(String className)
package test.reflect;

/**
 * @author 谢世杰
 */
public class GetClass {
   
    public static void main(String[] args) {
   
        Student student = new Student();

        // 第一种方式
        Class stuClass1 = student.getClass();
        System.out.println(stuClass1.getName());

        // 第二种方式
        Class stuClass2 = Student.class;
        System.out.println(int.class.getName());
        System.out.println(stuClass1 == stuClass2);

        // 第三种方式
        try {
   
            Class stuClass3 = Class.forName("test.reflect.Student");
            System.out.println(stuClass1 == stuClass3);
        } catch (ClassNotFoundException e) {
   
            e.printStackTrace();
        }
        
    }
}


运行结果:
test.reflect.Student
int
true
true

可以看到所有获得到的class对象都是同一个。


三、通过反射获取构造函数并使用

  • student类
package test.reflect;

/**
 * @author 谢世杰
 */
public class Student {
   
	public String id;
    private String name;
    private String sex;
    private int age;

    public Student() {
   
        System.out.println("公有,无参构造函数");
    }

    public Student(String name) {
   
        System.out.println("name:" + name);
    }

    private Student(int age) {
   
        System.out.println("私有构造函数" + age);
    }

	public void test(String name, int age) {
   
        System.out.println("name:"+name+" age:"+age);
    }

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

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

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

    public String getName() {
   
        return name;
    }

    public String getSex() {
   
        return sex;
    }

    public int getAge() {
   
        return age;
    }
}


  • 测试类
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员世杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值