Java笔记_22(反射和动态代理)

news2024/11/27 21:08:00

Java笔记_22

  • 一、反射
    • 1.1、反射的概述
    • 1.2、获取class对象的三种方式
    • 1.3、反射获取构造方法
    • 1.4、反射获取成员变量
    • 1.5、反射获取成员方法
    • 1.6、综合练习
      • 1.6.1、保存信息
      • 1.6.2、跟配置文件结合动态创建

一、反射

1.1、反射的概述

什么是反射?

反射允许对成员变量,成员方法和构造方法的信息进行编程访问
在这里插入图片描述

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

  1. Class.forName(“全类名”);
    • 全类名:包名+类名
  2. 类名.class
  3. 对象.getclass()
    在这里插入图片描述
package reflect.Dome1;

public class Dome {
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一
        Class aClass = Class.forName("reflect.Dome1.student");
        System.out.println(aClass);

        //方式二
        Class aClass1 = student.class;
        System.out.println(aClass1);//与方式一的结果相同

        student s = new student();
        Class aClass2 = s.getClass();
        System.out.println(aClass2);//三个方式结果相同
    }
}
package reflect.Dome1;

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 String toString() {
        return "student{name = " + name + ", age = " + age + "}";
    }
}

1.3、反射获取构造方法

Class类中用于获取构造方法的方法

方法名称说明
Constructor<?>[ ] getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[ ] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>… parameterTypes)返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>… parameterTypes)返回单个构造方法对象

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

方法名称说明
T newlnstance(Object… initargs)根据指定的构造方法创建对象
setAccessible(boolean flag)设置为true,表示取消访问权限
package reflect.Dome2;



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

public class dome {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class class1 = Class.forName("reflect.Dome2.student");

        Constructor[] constructors = class1.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        Constructor con = class1.getDeclaredConstructor(String.class,int.class);
        System.out.println(con);

        Constructor[] declaredConstructors = class1.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
        //如果是私有构造方法,则不能直接使用,只能看到
        //通过添加setAccessible方法,暴力取消临时权限校验。就可以使用
        con.setAccessible(true);
        student stu = (student) con.newInstance("张三", 21);
        System.out.println(stu);
    }
}
package reflect.Dome2;

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

    public student() {
    }

    private 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 String toString() {
        return "student{name = " + name + ", age = " + age + "}";
    }
}

1.4、反射获取成员变量

Class类中用于获取成员变量的方法

方法名称说明
Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象

Field类中用于创建对象的方法

方法名称说明
void set(Object obj, Object value)赋值
Object get(Object obj)获取值
package reflect.Dome3;

import java.lang.reflect.Field;

public class dome {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        Class clazz = Class.forName("reflect.Dome3.Student");

        //获取到公共成员变量
        Field[] fields = clazz.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        //查找该成员变量
        Field gender = clazz.getField("gender");
        System.out.println(gender);

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

        //获取私有变量
        Field name = clazz.getDeclaredField("name");
        System.out.println(name);

        //获取权限修饰符
        int modifiers = name.getModifiers();
        System.out.println(modifiers);
        //获取成员变量的名称
        String name1 = name.getName();
        System.out.println(name1);
        //获取成员变量的类型
        Class<?> type = name.getType();
        System.out.println(type);
        //创建一个对象
        Student s = new Student("张三",23,"男");
        name.setAccessible(true);
        Object o = name.get(s);
        System.out.println(o);
        //修改s里面name的值
        name.set(s,"小王");
        System.out.println(s);
    }
}
package reflect.Dome3;

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


    public Student() {
    }

    public Student(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = 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;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + ", gender = " + gender + "}";
    }
}

1.5、反射获取成员方法

Class类中用于获取成员方法的方法

方法名称说明
Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>… parameterTypes)返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>… parameterTypes)返回单个成员方法对象

Method类中用于创建对象的方法

方法名称说明
Object invoke(Object obj, Object… args)运行方法

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

package reflect.Dome4;

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

public class dome {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class aClass = Class.forName("reflect.Dome4.student");

        //包括父类的方法
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("===================================");
        //不包括父类的方法
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("===================================");
        //返回单个公共成员方法变量
        Method getAge = aClass.getMethod("setAge", int.class);
        System.out.println(getAge);
        System.out.println("===================================");
        //返回单个成员方法对象
        Method eat = aClass.getDeclaredMethod("eat", String.class);
        System.out.println(eat);
        //返回方法的名称
        System.out.println("===================================");
        String name = eat.getName();
        System.out.println(name);
        System.out.println("===================================");

        Class<?> declaringClass = eat.getDeclaringClass();
        System.out.println(declaringClass);
        System.out.println("===================================");

        //返回方法里面的参数
        Parameter[] parameters = eat.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        System.out.println("===================================");
        //返回方法抛出的异常
        Class<?>[] exceptionTypes = eat.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        //利用反射运行方法
        student s = new student("xiaowang",23,'男');
        eat.setAccessible(true);
        //没有返回值就不需要写
        //eat.invoke(s, "烧烤");
        //果如有返回值就需要写
        String o = (String) eat.invoke(s, "烧烤");
        System.out.println(o);
    }
}
package reflect.Dome4;

import java.io.IOException;

public class student {
    private String name;
    private int age;
    public char gender;

    public student() {
    }

    public student(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = 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 char getGender() {
        return gender;
    }

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

    private String eat(String str) throws IOException,RuntimeException,ArithmeticException {
        System.out.println(getName()+"正在吃"+str);
        return "奥利给";
    }
    public String toString() {
        return "student{name = " + name + ", age = " + age + ", gender = " + gender + "}";
    }
}

1.6、综合练习

反射的作用:

  1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
  2. 结合配置文件,动态的创建对象并调用方法

1.6.1、保存信息

在这里插入图片描述

package reflect.Dome5;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;

public class dome {
    public static void main(String[] args) throws IllegalAccessException, IOException {
        student s = new student("小明",18,181.0,"玩");
        teacher t = new teacher("王老师",30);

        printClass(t);
    }
    public static void printClass(Object obj) throws IllegalAccessException, IOException {
        Class aClass = obj.getClass();
        //创建IO流
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\Java\\IDEA\\代码文件\\Three\\a.txt"));

        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            //进行修饰符忽略
            declaredField.setAccessible(true);
            //获取到该变量的名字
            String name = declaredField.getName();
            //获取到该变量的值
            Object value = declaredField.get(obj);
            //写出数据
            bw.write(name+"="+value);
            bw.newLine();
            System.out.println(name+"="+value);
        }
        bw.flush();
        bw.close();
    }
}
package reflect.Dome5;

public class student {
    private String name;
    private int age;
    private double height;
    private String hobby;

    public student() {
    }

    public student(String name, int age, double height, String hobby) {
        this.name = name;
        this.age = age;
        this.height = height;
        this.hobby = hobby;
    }
    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;
    }urn height
     */
    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;
    }
    public String toString() {
        return "student{name = " + name + ", age = " + age + ", height = " + height + ", hobby = " + hobby + "}";
    }
}
package reflect.Dome5;

public class teacher {
    private String name;
    private int age;
    public teacher() {
    }
    public teacher(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 String toString() {
        return "teacher{name = " + name + ", age = " + age + "}";
    }
}

1.6.2、跟配置文件结合动态创建

在这里插入图片描述

package reflect.Dome6;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class dome {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //读取配置文件中的信息
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream("prop.properies");
        //读取的文件
        prop.load(fis);
        fis.close();
        System.out.println(prop);

        //获取全类名和方法名
        Object classname = prop.get("classname");
        Object method = prop.get("method");

        System.out.println(classname);
        System.out.println(method);

        //利用反射创建对象并运行方法
        Class<?> aClass = Class.forName((String) classname);
        //获取构造方法
        Constructor con = aClass.getDeclaredConstructor();

        Object o = con.newInstance();
        System.out.println(o);

        //获取成员方法并运行
        Method declaredMethod = aClass.getDeclaredMethod((String) method);
        declaredMethod.setAccessible(true);
        declaredMethod.invoke(o);
    }
}
package reflect.Dome6;

public class student {
    private String name;
    private int age;
    private char gender;

    public student() {
    }

    public student(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    public void study(){
        System.out.println("正在学习");
    }
    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 getGender() {
        return gender;
    }
    public void setGender(char gender) {
        this.gender = gender;
    }
    public String toString() {
        return "student{name = " + name + ", age = " + age + ", gender = " + gender + "}";
    }
}
classname=reflect.Dome6.student
method=study

在这里插入图片描述

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

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

相关文章

基于IC5000烧录器使用winIDEA烧写+调试程序(S32K324的软件烧写与调试)

目录 一、iSYSTEM简介二、如何使用iSYSTEM winIDEA烧写调试程序2.1 打开winIDEA&#xff1a;2.2 新建一个Workspace;2.3 硬件配置:2.4 选择CPU芯片型号&#xff1a;2.5 加载烧写文件&#xff1a;2.6 开始烧录程序&#xff1a;2.7 程序调试Debug&#xff1a;2.7.1 运行程序&…

PCL点云处理之单点选择的交互操作(一百六十七)

PCL点云处理之单点选择的交互操作(一百六十七) 一、效果展示二、实现代码一、效果展示 交互选择点,输出点信息,具体如下图所示 二、实现代码 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/pcl_visu

Spring Cloud Alibaba(二)Nacos统一配置管理

目录 一、为什么需要配置中心 二、常用的配置中心 Nacos 的几个概念 三、Nacos配置中心的使用 &#xff08;一&#xff09;properties格式 1、导入依赖 2、在配置中心新建配置 3、修改配置文件名为bootstrap.yml 4、在微服务中添加nacos config服务地址的配置 5、测试…

chatgpt赋能Python-numpy精度

Numpy精度介绍 Numpy是一个用于进行科学计算的Python库&#xff0c;它提供了多维数组对象以及一系列用于操作数组的函数。Numpy的广泛使用使其成为数据科学中的重要组成部分。然而&#xff0c;Numpy中的精度问题却常常被忽视。 浮点数精度问题 在Numpy中&#xff0c;浮点数是…

STL与string类的认识及简单使用

STL与string类的认识及简单使用 一、STL二、string类构造函数容量操作访问及遍历操作迭代器 修改操作非成员函数重载关系运算符重载getline 三、总结 一、STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组…

【计算机毕设】基于SringBoot+Vue的校园二手交易平台(含支付)

在导师的严格指导下&#xff0c;我的毕业设计终于完成了&#xff0c;毕设被推优算是给大学生活画上了圆满的句号&#xff0c;几个月的努力也没白费。在开发的过程中收获了很多&#xff0c;也遇到很多问题&#xff0c;但因怕时间来不及&#xff08;根本不知道截止时间TvT&#x…

点餐小程序实战教程04-餐品分类及餐品数据源设计

我们已经利用一定篇幅实现了店铺信息展示的功能,本篇我们来实现一下点餐的逻辑。点餐的逻辑有以下: 用户打开点餐页面,利用侧边栏导航来切换菜品初始状态用户未点餐,显示一个加号的图标点击加号显示数量,需要将菜品加入购物车,购物车显示选购菜品的数量和总价点击减号可以…

[日记]LeetCode算法·二十五——二叉树⑤ AVL树(插入+删除)附代码实现

本章的代码实现基于上一篇BST与优先队列的基类进行平衡二叉树&#xff0c;即AVL树。 文章目录 AVL的概念AVL查询效率AVL的插入1.插入节点2.更新平衡因子BF3.旋转调整树的结构3.1 LL 右旋3.2 RR 左旋3.3 LR 左右双旋3.4 RL 右左双旋 4 插入总结 AVL的删除1.寻找删除节点2.更新平…

窗口组件元素识别工具

inspect.exe 微软官方工具集成于 Windows SDK 官网下载&#xff1a;https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/ FlaUInspect&#xff1a; 第三方开源的识别工具 https://github.com/FlaUI/FlaUInspect UIRecorder&#xff1a; WinAppDriver里…

无状态子域名爆破工具(附下载)

ksubdomain是一款基于无状态子域名爆破工具&#xff0c;支持在Windows/Linux/Mac上使用&#xff0c;它会很快的进行DNS爆破&#xff0c;在Mac和Windows上理论最大发包速度在30w/s,linux上为160w/s的速度。 总的来说&#xff0c;ksubdomain能爆破/验证域名&#xff0c;并且快和…

【P25】JMeter 取样器超时(Sample Timeout)

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设…

CHATGPT:北京打响大模型地方战第一枪

5月16日消息&#xff0c;最近&#xff0c;“北京市促进通用人工智能创新发展的若干措施&#xff08;2023-2025年&#xff09;&#xff08;征求意见稿&#xff09;”&#xff08;以下简称“措施”&#xff09;公布。这个措施从算力、数据、算法、应用、监管五个方向出发&#xf…

Redis学习---03

一、redis事务 (1) Redis单条命令保证原子性&#xff0c;但事务不保证原子性。 Redis 事务不是严格意义上的事务&#xff0c;只是用于帮助用户在一个步骤中执行多个命令。单个 Redis 命令的执行是原子性的&#xff0c;但 Redis 没有在事务上增加任何维持原子性的机制&#xf…

STL好难(2):string类的使用

【本节目标】 1. 标准库中的string类2. string类的模拟实现3. 扩展阅读 目录 【本节目标】 1.标准库中的string类 2. string类对象的常见构造 &#x1f349;无参构造 &#x1f349;带参构造 &#x1f349;拷贝构造 &#x1f349;用n字符 # 去初始化 &#x1f349;用字…

二进制部署高可用Kubernetes集群

SUMMARY 架构图 设备规划 序号名字功能VMNET 1备注 1备注 2备注 3 备注 4备注 50orgin界面192.168.164.10haproxykeepalived192.168.164.2001reporsitory仓库192.168.164.16yum 仓库registoryhaproxykeepalived2master01H-K8S-1192.168.164.11kube-apicontrollerscheduler…

约瑟夫问题及求解方法

文章目录 什么是约瑟夫问题&#xff1f;求解方法代码实现 什么是约瑟夫问题&#xff1f; 约瑟夫问题是一个经典的数学难题&#xff0c;其一般形式可以描述为&#xff1a; n个人&#xff08;编号从1到n&#xff09;&#xff0c;围坐在一张圆桌周围。从第一个人开始报数&#x…

chatgpt赋能Python-mac系统的python

在Mac系统上运行Python&#xff1a;一个简介 介绍 Python是一种流行的、易于学习的编程语言&#xff0c;被广泛用于各种用途&#xff0c;从数据分析到机器学习。如果您是Mac用户&#xff0c;那么您已经安装了Python&#xff0c;因为它是系统的一部分。本文将介绍如何在Mac系统…

Web基础 ( 五 ) JavaScript BOM

4.4.BOM浏览器对象模型 window代表窗体, 内置多种对象, 每种对象包含多种方法及属性 4.4.1.location 地址栏 window.location.href "url"; // 当前窗口加载指定的页面location.reload(); //刷新4.4.2.history 访问历史记录 window.history.back(); // 返回上一…

搞一搞用例图

前言 基于公司技术方案的设计比较重视用例图&#xff0c;重新学习一下相关内容。用例要说明参与者与用例之间的关系&#xff0c;那么对用例图相关要点进行梳理 用例图的定义及组成要素用例图的4种关系常用的用例图软件 定义与组成 用例图核心作用是将系统需求和参与者之间的…