Java反射(通俗易懂!)

news2024/11/25 16:05:04

文章目录

  • 2.反射
    • 2.1反射的概述
    • 2.2 获取 Class类对象的三种方式
    • 2.3反射获取构造方法并使用
      • 2.3.1Class 类获取构造方法对象的方法
      • 2.3.2Constructor类用于创建对象的方法
      • 2.3.3小结
    • 2.4反射获取成员变量并使用
      • 2.4.1Class类获取成员变量对象的方法
      • 2.4.2Field类用于给成员变量赋值的方法
    • 2.5反射获取成员方法并使用
      • 2.5.1Class类获取成员方法对象的方法
      • 2.5.2Method类用于执行方法的方法

2.反射

2.1反射的概述

  • 反射机制
    是在运行状态中对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法;这种动态获取信息以及动态调用对象方法的功能称为 Java语言的反射机制。

2.2 获取 Class类对象的三种方式

for

  • 三种方式分类

    • 类名.class属性
    • 对象名.getClass()方法
    • Class. forName(全类名)方法
      在这里插入图片描述
  • 代码演示

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

    public Student() {

    }

    public Student(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;
    }
    public void study(){
        System.out.println("学生在学习");
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
/**
 * 获取 class 对象的三种方式
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.Class 类中的静态方法forName("全类名")
        //全类名:包名 + 类名
        Class clazz = Class.forName("com.itheima.myreflect1.Student");
        System.out.println(clazz);

        //2.通过 class 属性来获取
        Class clazz2 = Student.class;
        System.out.println(clazz2);

        //3.利用对象的 getClass 方法来获取 class 对象
        //所有的对象都能获取到类对应的字节码文件,所以说 getClass 方法是定义在Object类中
        Student s  = new Student();
        Class clazz3 = s.getClass();
        System.out.println(clazz3);

        //一个类的Class对象是唯一的
    }
}
  • 运行结果
    在这里插入图片描述

2.3反射获取构造方法并使用

2.3.1Class 类获取构造方法对象的方法

  • 方法介绍
方法名说明
Constructor<?>[]getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[]getDeclaredConstructors()返回所有构造方法对象的数组
Constructor getConstructor(Class<?> …parameterTypes)返回单个公共构造方法对象
Constructor getDeclaredConstructor(Class<?>… parameterTypes)返回单个构造方法对象
  • 代码演示
public class Student {
    private String name;
    private int age;

    //私有的有参构造方法

    private Student(String name) {
        System.out.println("name的值为:"+ name);
        System.out.println("private...Student...有参的构造方法");
    }

    //公共的无参构造方法
    public Student(){
        System.out.println("public...Student...无参构造方法");
    }

    //公共的有参构造方法
    public Student(String name,int age){
        System.out.println("name的值为:"+name+"age的值为:"+age);
        System.out.println("public...student...有参构造方法");
    }
}
import java.lang.reflect.Constructor;

public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
    //    method1();

        //method2();

        //method3();

        //method4();

    }

    private static void method4() throws ClassNotFoundException, NoSuchMethodException {
        //Constructor<T>getDeclaredConstructor(Class<?>...parameterTypes):
        //获取单个的构造方法对象(公有或私有都可以获取)
        //1.获取Class对象
        Class clazz = Class.forName("com.itheima.myreflect2.Student");
        Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor);
    }

    private static void method3() throws ClassNotFoundException, NoSuchMethodException {
        //Constructor<T> getConstructor(Class<?>...parameterTypes):
        //返回单个公共构造方法对象
        //1.获取Class对象
        Class clazz = Class.forName("com.itheima.myreflect2.Student");
        Constructor constructor = clazz.getConstructor(String.class,int.class);//小括号中,一定要跟构造方法的形参保持一致(包括顺序也要一致)
        System.out.println(constructor);
    }

    private static void method2() throws ClassNotFoundException {
        // Constructor<?>[] getDeclaredConstructors():
        //返回所有构造方法对象的数组
        //1.获取Class对象
        Class clazz = Class.forName("com.itheima.myreflect2.Student");
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
    }


    private static void method1() throws ClassNotFoundException {
        //Constructor<?>[] getConstructors():
        //返回所有公共构造方法对象的数组
        //1.获取Class对象
        Class clazz = Class.forName("com.itheima.myreflect2.Student");
        Constructor[] constructors = clazz.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
    }

}

2.3.2Constructor类用于创建对象的方法

  • 方法介绍
方法名说明
T newInstance(Object … initargs)根据指定的构造方法创建对象
setAccessible(boolean flag)设置为true,表示取消访问检查
  • 代码演示
 /**
 *  获取Constructor对象并创建对象
 */
public class ReflectDemo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //T newInstance(Object...initargs):根据指定的构造方法创建对象

//        method1();
        //1.获取class对象
        Class clazz = Class.forName("com.itheima.myreflect2.Student");
        Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class);

        //被 private 修饰的成员,不能直接使用的
        //如果用反射强行获取并使用,需要临时取消访问检查
        declaredConstructor.setAccessible(true);

        Student student2 = (Student) declaredConstructor.newInstance("张三");
        System.out.println(student2);

    }

    private static void method1() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //1.获取class对象
        Class clazz = Class.forName("com.itheima.myreflect2.Student");

        //2.获取构造构造方法对象
        Constructor constructor = clazz.getConstructor(String.class, int.class);

        //3.利用 newInstance()方法创建 Student 的对象
        Student student1 = (Student) constructor.newInstance("张三", 23);
        System.out.println(student1);
    }
}



2.3.3小结

  • 获取 class 对象
    三种方式:Class.forName(“全类名”),类名.class,对象名.getClass()

  • 获取里面的构造方法对象
    getConstructor(Class<?> ... parameterTypes) getDeclaredConstructor(Class<?>… parameterTypes)

  • 如果是 public 的,直接创建对象
    newInstance(Object … initargs)

  • 如果是非 public 的,需要临时取消检查,然后再创建对象
    setAccessible(boolean)暴力反射

2.4反射获取成员变量并使用

2.4.1Class类获取成员变量对象的方法

  • 方法分类
方法名说明
Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象
  • 代码演示
public class Student {
    public String name;
    public int age;
    public String gender;
    private int money = 300;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", money=" + money +
                '}';
    }
}
import java.lang.reflect.Field;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
//      method1();

        //method2();

       //method3();
//        method4();

    }

    private static void method4() throws ClassNotFoundException, NoSuchFieldException {
        //  Field getDeclaredField(String name):返回单个成员变量对象
        Class<?> clazz = Class.forName("com.itheima.myreflect3.Student");
        Field money = clazz.getDeclaredField("money");
        System.out.println(money);
    }

    private static void method3() throws ClassNotFoundException, NoSuchFieldException {
        //Field[] getField(String name):返回单个公共成员变量对象
        //想要获取的成员变量必须是真实存在的,且必须是 public 修饰的。
        Class clazz = Class.forName("com.itheima.myreflect3.Student");
        //获取 name 这个成员变量
        Field name = clazz.getField("name");
        System.out.println(name);
    }

    private static void method2() throws ClassNotFoundException {
        //Field[] getDeclaredFields():返回所有成员变量对象的数组
        Class<?> clazz = Class.forName("com.itheima.myreflect3.Student");
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
    }

    private static void method1() throws ClassNotFoundException {
        //Field[] getFields():返回所有公共成员变量对象的数组

        //1.获取Class对象
        Class clazz = Class.forName("com.itheima.myreflect3.Student");

        //2.获取Field对象
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }
}

2.4.2Field类用于给成员变量赋值的方法

  • 方法介绍
方法名说明
void set(Object obj,Object value)赋值
Object get(Object obj)获取值
  • 代码演示
import java.lang.reflect.Field;

public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
        // void set(Object obj,Object value):给 obj 对象的成员变量赋值为 value
        // Object get( Object obj)返回由 该 field 表示的字段在指定对象上的值。

         method1();
        method2();


    }

    private static void method2() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
        Class clazz = Class.forName("com.itheima.myreflect3.Student");
        Field field = clazz.getField("name");
        Student student = (Student) clazz.newInstance();
        System.out.println( field.get(student));
        ;
    }

    private static void method1() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
        //1.获取 class 对象
        Class clazz = Class.forName("com.itheima.myreflect3.Student");
        //2.获取 name 这个Field对象
        Field field = clazz.getField("name");
        //3.利用set方法进行赋值。
        //3.1先创建一个Student对象
        Student student = (Student) clazz.newInstance();
        //3.2有了对象才可以给指定的对象进行赋值
        field.set(student,"张三");

        System.out.println(student);
    }
}

2.5反射获取成员方法并使用

2.5.1Class类获取成员方法对象的方法

  • 方法分类
方法名说明
Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>…parameterTypes)返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>…parameterTypes)返回单个成员方法对象
  • 代码演示
public class Student {
    //私有的,无参无返回值
    private void show(){
        System.out.println("私有的show方法,无参无返回值");
    }

    //公共的,无参无返回值
    public void function1(){
        System.out.println("function1方法,无参无返回值");
    }

    //公共的有参无返回值
        public void function2(String name){
            System.out.println("function2方法,有参无返回值,参数为"+ name);
        }

    //公共的,无参有返回值
    public String function3(){
        System.out.println("function3方法,无参有返回值");
        return "aaa";
    }
    //公共的有参有返回值
    public String function4(String name){
        System.out.println("function4方法,有参有返回值,参数为"+ name);
        return "aaa";
    }

}
import java.lang.reflect.Method;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //method1();
        //method2();
        //method3();
        //method4();


    }

    private static void method4() throws ClassNotFoundException, NoSuchMethodException {
        //Method getDeclaredMethod(String name,Class<?>... parameterTypes)
        //返回单个成员方法对象
        //1.获取 class 对象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");
        //2.获取成员方法对象
        Method method = clazz.getDeclaredMethod("show");
        System.out.println(method);
    }

    private static void method3() throws ClassNotFoundException, NoSuchMethodException {
        //Method getMethod(String name,Class<?>...parameterTypes)
        //返回单个公共成员方法对象
        //1.获取 class 对象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");
        //2.获取成员方法对象
        //获取成员方法function1
        Method method1 = clazz.getMethod("function1");
        System.out.println(method1);
    }

    private static void method2() throws ClassNotFoundException {
        // Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
        //1.获取 class 对象
        Class<?> clazz = Class.forName("com.itheima.myreflect4.Student");
        //2.获取成员方法对象
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
    }

    private static void method1() throws ClassNotFoundException {
        // Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
        //1.获取 class 对象
        Class<?> clazz = Class.forName("com.itheima.myreflect4.Student");
        //2.获取成员方法对象
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
    }
}

2.5.2Method类用于执行方法的方法

  • 方法介绍
方法名说明
Object invoke(Object obj,Object…args)运行方法

参数一: 用obj对象调用该方法
参数二: 调用方法的传递的参数(如果没有就不写)
返回值: 方法的返回值(如果没有就不写)

  • 代码演示
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        // Object invoke(Object obj,Object ... args):运行方法
        //参数一:用 obj 对象调用该方法
        //参数二:调用方法的传递的参数(如果没有就不写)
        //返回值:方法的返回值(如果没有就不写)

        //1.获取 class 对象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");
        //2.获取里面的 Method 对象,function4
        Method method = clazz.getMethod("function4", String.class);
        //3.运行方法
        //3.1创建一个 Student对象,来当做方法的调用者
        Student student = (Student) clazz.newInstance();
        //3.2运行方法
        Object result = method.invoke(student, "zhangsan");
        //如果方法没有返回值,左边这个接收变量就可以不写了
        //4.打印一下返回值
        System.out.println(result);

    }
}

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

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

相关文章

木字楠后台管理系统开发(5):Vue登陆界面编写以及与后台联调测试

&#x1f3b6; 文章简介&#xff1a;木字楠后台管理系统开发(5)&#xff1a;Vue登陆界面编写以及与后台联调测试 &#x1f4a1; 创作目的&#xff1a;为了带大家完整的体验木字楠后台管理系统模版的开发流程 ☀️ 今日天气&#xff1a;愿冷空气冷藏你的烦恼,让快乐永驻。 &…

PaddleX API开发模式快速上手文档

目录一. 环境安装1.1 PaddlePaddle-gpu安装1.2 PaddleX安装二. 快速训练2.1 准备数据集2.2 定义图像预处理与数据增强2.3 定义并装载数据2.4 开始训练2.5 使用Visual查看训练情况三. 部署推理3.1 模型加载预测PaddleX官方文档(以图像分类为例)&#xff1a;PaddleX/docs/quick_s…

MySQL索引优化(一)

文章目录一、索引介绍1. 什么是MySQL的索引2. 索引数据结构3. 索引优势4. 索引劣势5. 索引使用场景&#xff08;1&#xff09;需要建立索引的场景&#xff08;2&#xff09;不推荐建立索引的场景6. 索引分类&#xff08;1&#xff09;主键索引&#xff08;2&#xff09;唯一索引…

【k8s 实战】Prometheus Operator 高级配置- 监控Kubernetes自动发现

上文我们一起学习了如何在 Prometheus Operator 下面自定义一个监控选项&#xff0c;以及自定义报警规则的使用。那么我们还能够直接使用前面课程中的自动发现功能吗&#xff1f;如果在我们的 Kubernetes 集群中有了很多的 Service/Pod&#xff0c;那么我们都需要一个一个的去建…

MATLAB傅里叶变换和加入噪声后的傅里叶变换

1.傅里叶变换代码 查看String为傅里叶变换的button添加callback函数&#xff0c;可以通过查看callback函数快速定位到该位置 function pushbutton37_Callback(hObject, eventdata, handles)%傅里叶变换&#xff08;频谱图&#xff09; axes(handles.show_proImg); global fpat…

[附源码]Nodejs计算机毕业设计基于的二手房交易系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

动态规划——状态机模型

文章目录概述大盗阿福思路代码股票买卖 IV思路代码股票买卖 V思路代码总结概述 定义&#xff1a; 它是一个有向图形&#xff0c;由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内&#xff0c;其…

QT 6开发环境搭建——Windows环境

QT 目前不支持离线安装&#xff0c;只支持在线安装。&#xff08;从Qt5.15版本后不支持离线安装&#xff09; 去下面的网址&#xff0c;下载在线安装包&#xff1a; https://download.qt.io/archive/online_installers 我个人选择的是4.3.可以选择更新的版本。选择合适自己电…

时间序列的蒙特卡罗交叉验证

交叉验证应用于时间序列需要注意是要防止泄漏和获得可靠的性能估计本文将介绍蒙特卡洛交叉验证。这是一种流行的TimeSeriesSplits方法的替代方法。 时间序列交叉验证 TimeSeriesSplit通常是时间序列数据进行交叉验证的首选方法。下图1说明了该方法的操作方式。可用的时间序列…

编译原理实验三:算符优先分析算法的设计与实现(python)

实验目的 根据算符优先分析法&#xff0c;对表达式进行语法分析&#xff0c;使其能够判断一个表达式是否正确。通过算符优先分析方法的实现&#xff0c;加深对自下而上语法分析方法的理解。 实验内容 1、输入文法。可以是如下算术表达式的文法&#xff08;你可以根据需要适当…

赋能组织执行力学习-R4管理-结果体系、责任体系、检查与改进体系、及时激励体系

本文向大家介绍R4管理&#xff0c;是由结果体系&#xff08;Result&#xff09;、责任体系&#xff08;Responsibility&#xff09;、检查与改进体系&#xff08;Review&#xff09;、及时激励体系&#xff08;Reward&#xff09;组成&#xff0c;帮助我们如何更好的运用。 马云…

TikTok选品技巧 | 爆品一般是怎么选出来的,快看这些技巧

TikTok电商商家看过来&#xff01;随着短视频时代的兴起与发展&#xff0c;TikTok在全球受到越来越多的用户所追捧。同时&#xff0c;吸引了更多TikTok商家前来发展电商。但是&#xff0c;想要在这里快速实现TikTok变现目标&#xff0c;并非容易。TikTok选品和TikTok营销是最不…

数据库原理及MySQL应用 | 多表查询

在实际应用中&#xff0c;多表查询应用相对较多&#xff0c;根据多表之间的相关列&#xff0c;可以从多个表中检索出所需数据。 在实际应用中&#xff0c;单表查询应用范围相对较少&#xff0c;因为用户需要的数据往往存储在多个不同的表中&#xff0c;这时需要进行多表查询。…

oracle的pkg改为hivesql

1. oracle的() 改为hive左右连接 oracle ()学习_cclovezbf的博客-CSDN博客最近工作需要将oracle的存储过程转化为hive的sql脚本。遇到很多不一样的地方&#xff0c;例如oracle连接中有()号的用法。借鉴这篇文章&#xff0c;但是这个排版比较烂。。。先建表和插入数据首先说明…

笔试强训(四十六)

目录一、选择题二、编程题2.1 简单错误记录2.1.1 题目2.1.2 题解一、选择题 &#xff08;1&#xff09;一台刚接入互联网的WEB服务器第一次被访问到时&#xff0c;不同协议的发生顺序是下面中的&#xff08;A&#xff09; A.ARP->DNS->HTTP B.ARP->HTTP->DNS C.DN…

怎么提取伴奏?有什么实用的提取软件?

由于我喜欢唱歌&#xff0c;所以在读书时期偶尔会参加学校的一些歌唱比赛或是文艺汇演。而一开始的我没什么经验&#xff0c;练习时都是放着原声带跟唱&#xff0c;但是到了舞台上发现只有伴奏&#xff0c;一时间卡不到开唱的点&#xff0c;甚是尴尬。所以后来我吸取了教训&…

蓝桥杯嵌入式 cubeMX生成代码解读

文章目录前言一、代码风格二、为什么要这些注释&#xff1f;三、生成的独立模块的代码总结前言 本篇文章讲介绍一下cubeMX生成代码的风格。 一、代码风格 在main.c中可以看到非常多的注释代码&#xff0c;很多人都不知道这些是用来干嘛的&#xff0c;现在就给大家介绍一下这…

你了解Java中的ForkJoin吗?

什么是ForkJoin? ForkJoin 从字面上看Fork是分岔的意思&#xff0c;Join是结合的意思&#xff0c;我们可以理解为将大任务拆分成小任务进行计算求解&#xff0c;最后将小任务的结果进行结合求出大任务的解&#xff0c;这些裂变出来的小任务&#xff0c;我们就可以交给不同的线…

新智慧杂志新智慧杂志社新智慧编辑部2022年第30期目录

杏坛潮_热点关注 特色劳动教育模式探究——基于“劳动周”项目的设计与实践 王胜; 1-3《新智慧》投稿&#xff1a;cn7kantougao163.com “双减”背景下小学数学大单元深度学习的实践与探索——以小学高年级为例 王晓雪; 4-6 杏坛潮_创新教育 问题教学法在高中物理教…

20221215英语学习

今日新词&#xff1a; rich adj.富有的, 富裕的, 油腻的 luck n.运气, 幸运, 好运, 侥幸 live adj.活的, 现场直播的, 实况转播的, 现场演出的 tutor n.家庭教师&#xff1b;私人教师&#xff1b;导师&#xff1b;助教 swipe v.挥拳打, 扬起巴掌打, 挥起&#xff08;物体&…