案例挑战—java反射

news/2024/5/19 5:44:23 标签: java, 反射

这里写目录标题

  • 背景
  • 一、为什么要使用反射
  • 二、反射的应用
    • 反射常用应用的思维导图
    • 2.1获取class对象的三种方法
        • 示例代码
    • 2.2利用反射获取构造方法
      • 示例代码
    • 2.3利用反射获取成员变量
      • 示例代码
    • 2.4利用反射获取成员方法
  • 三、总结
  • 四、升华

背景

由于在公司自研的新项目架构中使用了大量的反射来提高项目的可复用、灵活性。
项目运用的场景有:
1.程序运行期间动态生成类并进行调用
2.通过反射时间接口的高复用
趁着这个机会博主对反射的基本应用进行汇总和总结。

一、为什么要使用反射

反射是一项强大的功能。

  1. 它允许你在运行时动态操作类、对象、方法和属性
  2. 它允许你访问类的私有属性和私有方法

二、反射的应用

反射常用应用的思维导图

在这里插入图片描述

2.1获取class对象的三种方法

  1. Class.forName(“全限定类名”)
  2. 类名.class
  3. 对象.getClass();

全限定类名=该类所处的包路径+类名

示例代码

Student类

java">package com.wangwei.myreflec1;


public class Student {
    private String name;

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

Demo1类

java">package com.wangwei.myreflec1;


public class Demo1 {

    /*
    获取class对象的三种方式
    1.Class.forName("全限定类名")
    2.类名.class
    3.对象.getClass();
     */

    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com.wangwei.myreflec1.Student");
        System.out.println(aClass);

        Class<Student> aClass1 = Student.class;
        System.out.println(aClass1);

        Student student = new Student();
        Class<? extends Student> aClass2 = student.getClass();
        System.out.println(aClass==aClass1);
        System.out.println(aClass1==aClass2);

    }
}

运行结果
在这里插入图片描述

2.2利用反射获取构造方法

在这里插入图片描述

示例代码

Student类

java">package com.wangwei.myreflect2;


public class Student {
    public Student(){

    }

    public Student (String name){
        this.name=name;
    }
    private Student(int age){
        this.age=age;
    }

    protected Student(String name,int age){
        this.name=name;
        this.age=age;
    }

    private String name;

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

Demo2类

java">package com.wangwei.myreflect2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 通过反射获取构造方法
 */
public class Demo2 {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        //1.获取class字节码文件对象
        Class<?> aClass = Class.forName("com.wangwei.myreflect2.Student");

        //2.获取构造方法
//        Constructor<?>[] constructors = aClass.getConstructors();
//        for (Constructor con:constructors){
//            System.out.println(con);
//        }

//        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
//        for (Constructor con:declaredConstructors){
//            System.out.println(con);
//        }

//        Constructor<?> constructor = aClass.getConstructor();
//        System.out.println(constructor);

        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(int.class);
        System.out.println(declaredConstructor);

        declaredConstructor.setAccessible(true);
        Student david = (Student)declaredConstructor.newInstance(18);
        System.out.println(david.getAge());


    }
}

运行结果
在这里插入图片描述

2.3利用反射获取成员变量

获取到成员变量,对成员变量进行赋值和取值操作。
在这里插入图片描述

示例代码

Student类

java">package com.wangwei.myreflect3;


public class Student {
    public Student(){

    }

    public Student(String name){
        this.name=name;
    }
    private Student(int age){
        this.age=age;
    }

    protected Student(String name, int age){
        this.name=name;
        this.age=age;
    }

    public Student(String name, int age,String gender){
        this.name=name;
        this.age=age;
        this.gender=gender;
    }

    private String name;

    private int age;

    public String gender;

    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 String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

Demo3类

java">package com.wangwei.myreflect3;

import java.lang.reflect.Field;

/**
 * 通过反射获取成员变量
 */
public class Demo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //1.获取class字节码文件的对象
        Class<?> aClass = Class.forName("com.wangwei.myreflect3.Student");

        //2.获取公共成员变量
//        Field[] fields = aClass.getFields();
//        for(Field field:fields){
//            System.out.println(field);
//        }

        //获取所有成员变量
//        Field[] declaredFields = aClass.getDeclaredFields();
//        for(Field field:declaredFields){
//            System.out.println(field);
//        }

        //获取单个公共的成员变量
        Field gender = aClass.getField("gender");
        System.out.println(gender);

        //获取成员变量的值
        Student student = new Student("David", 18, "男");
        String value = (String)gender.get(student);
        System.out.println(value);

        //修改对象成员变量的值
        gender.set(student,"Daxi");
        String value1 = (String)gender.get(student);
        System.out.println(value1);

    }
}

运行结果
在这里插入图片描述

2.4利用反射获取成员方法

在这里插入图片描述
Student类

java">package com.wangwei.myreflect4;


public class Student {

    public Student(){

    }

    public Student(String name,int age){

    }
    private String name;

    private int 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 sleep(){
        System.out.println("睡觉");
    }

    private void eat(String something){
        System.out.println("吃"+something);
    }
}

Demo4类

java">package com.wangwei.myreflect4;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Demo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.获取class字节码文件对象
        Class<?> aClass = Class.forName("com.wangwei.myreflect4.Student");

        //2.获取所有公共的方法对象(包含父类中的方法)
//        Method[] methods = aClass.getMethods();
//        for (Method method:methods){
//            System.out.println(method);
//        }

        //获取所有的方法对象(不能回去父类的,但是可以获取本类中私有的方法
//        Method[] declaredMethods = aClass.getDeclaredMethods();
//        for (Method method:declaredMethods){
//            System.out.println(method);
//        }

        //获取具体方法对象
        Method eat = aClass.getDeclaredMethod("eat", String.class);
        System.out.println(eat);

        //方法运行
        Student student = new Student();
        eat.setAccessible(true);
        eat.invoke(student, "汉堡");
    }
}

运行结果
在这里插入图片描述

三、总结

  1. 在项目新架构中大量使用了反射,越发能够体会到反射的强大之处,是实现架构底层高复用、高扩展、高维护的实现方式之一。

四、升华

  1. 学习是一个迭代的过程:通过这一次的博客总结,博主对于反射的概念理解以及在宏观的运用上达到了熟练的层次。

http://www.niftyadmin.cn/n/4996706.html

相关文章

xss前十二关靶场练习

目录 一、xss原理和分类 1.原理 2.分类&#xff1a;xss分为存储型和反射型以及dom型 &#xff08;1&#xff09;反射性 &#xff08;2&#xff09;存储型 &#xff08;3&#xff09;dom型 二、靶场关卡练习​编辑 1.第一关 2.第二关 3.第三关 4.第四关 5.第五关 6…

程序员必备技能之调试

目录 前言 本期内容介绍 一、什么是Bug&#xff1f; 二、调试以及调试的重要性 2.1什么是调试&#xff1f; 2.2调试的基本步骤 ​三、Debug和Release介绍 Debug和Release 四、windows环境下的调试介绍 4.1调试环境 4.2一些调试常用的快捷键 4.3调试时查看当前程序的…

【Python Odyssey】1-1 | Python初见面

文章目录 Python 由来Python 的历史Python 的优点Python的缺点Python 运用领域Python 环境配置Python 解释器安装确认Python的版本编写Python源代码运行程序 Python 由来 Python 是 吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;在阿姆斯特丹为了打发无聊的圣诞节&…

Programming abstractions in C阅读笔记:p139-p143

《Programming Abstractions In C》学习第55天&#xff0c;p139-p140&#xff0c;总结如下&#xff1a; 一、技术总结 1.文件I/O操作 文件I/O操作可以分为一下这些步骤&#xff1a; (1)声明文件指针对象。 File *infile;(2)打开文件 fopen()。打开文件的模式有“r”, “w…

【python】可视化

柱状图 matplotlib之pyplot模块之柱状图&#xff08;bar()&#xff1a;基础参数、外观参数&#xff09;_plt.bar_mighty13的博客-CSDN博客 bar()的基础参数如下&#xff1a; x&#xff1a;柱子在x轴上的坐标。浮点数或类数组结构。注意x可以为字符串数组&#xff01; height&…

libudev 和 libusb 常见API分析

libudev详解: libudev是Linux系统下的一个库&#xff0c;它提供针对内核提供的udev设备管理服务的函数库。udev是一种内核机制&#xff0c;用于在系统中传递解决方案的有关设备信息&#xff0c;以及在出现设备事件&#xff08;如删除、插入设备&#xff09;时触发相应的操作。 …

思维的深度,决定职场的高度

经常有读者问我&#xff0c;自己做事很努力&#xff0c;可是结果却总是不尽如人意&#xff0c;问题究竟出在哪里&#xff1f; 虽然成事的关键因素有很多&#xff0c;但是归根结底其实只有两点&#xff0c;就是做局和破局。也就是&#xff0c;如何识破别人给你做的局&#xff1f…

C#面试十问

1&#xff1a;C#中变量类型分为哪两种&#xff1f;它们的区别是什么&#xff1f;2&#xff1a;Class和Struct的区别&#xff1f;3&#xff1a;C#中类的修饰符和类成员的修饰符有哪些&#xff1f;4&#xff1a;面向对象的三个特征&#xff08;特点&#xff09;是什么&#xff1f…