JAVA基础学习笔记_反射+动态代理

文章目录

  • 反射
    • 获取class对象的三种方式
    • 获取构造方法
    • 获取成员变量
    • 获取成员方法
    • 反射的作用
  • 动态代理

反射

允许对成员变量\成员方法\构造方法的信息进行编程访问
把类内的信息扒的干干净净,获取+解剖
获取从class字节码文件中获取

获取class对象的三种方式

public static void main(String[] args) throws ClassNotFoundException {//第一种//最为常用Class<?> aClass = Class.forName("com.itheima.stream.Student");System.out.println(aClass);//第二种//更多是作为参数进行传递Class<Student> studentClass = Student.class;System.out.println(studentClass);//第三种//有了这个类的对象,才可以使用Student student = new Student();Class<? extends Student> aClass1 = student.getClass();System.out.println(aClass1);
}

获取构造方法

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class<?> aClass = Class.forName("com.itheima.stream.Student");
//        aClass.getConstructors();//返回所有的公共构造方法
//        aClass.getDeclaredConstructors();//返回所有的构造方法
//        aClass.getConstructor();//返回单个公共的构造方法
//        aClass.getDeclaredConstructor();//返回单个的构造方法Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class);//获取构造中的参数Parameter[] parameters = declaredConstructor.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}//用反射创建对象//如果是私有的构造方法,需要设置 accessible 为 true,暴力反射访问declaredConstructor.setAccessible(true);Student student = (Student) declaredConstructor.newInstance("张三", 23);System.out.println(student);
}

获取成员变量

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {Class<?> aClass = Class.forName("com.itheima.stream.Student");
//        aClass.getFields();
//        aClass.getDeclaredFields();
//        aClass.getField();
//        aClass.getDeclaredField();Field[] declaredFields = aClass.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}Field name = aClass.getField("name");//获取权限修饰符System.out.println(name.getModifiers());//获取成员变量类型System.out.println(name.getType());
}

获取成员方法

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {Class<?> aClass = Class.forName("com.itheima.stream.Student");
//        aClass.getMethods();//获取所有的方法(包含父类)
//        aClass.getDeclaredMethods();//获取本类所有的方法(不包含父类)Method method = aClass.getMethod("toString");
//        aClass.getDeclaredMethod();//获取抛出的异常Class<?>[] exceptionTypes = method.getExceptionTypes();for (Class<?> exceptionType : exceptionTypes) {System.out.println(exceptionType.getName());}Method eat = aClass.getMethod("eat", String.class);Student student = new Student();Object out = eat.invoke(student, "汉堡");System.out.println(out);
}

这里的invoke是重点,苍穹外卖的代理有用到

反射的作用

  • 获取一个类里面所有的信息,获取到之后,再执行其他的业务逻辑
  • 结合配置文件,动态的创建对象并调用方法
    确实,我也想不出来怎么从配置文件中获取或修改方法类
public static void saveObject(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class clazz = object.getClass();//获取所有的成员变量Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);String name = declaredField.getName();Object o = declaredField.get(object);System.out.println(name + ":" + o);}
}

动态代理

无侵入式的给对象增强其他的功能
代理工具类

public class ProxyUtil {public static Star createProxy(BigStar bigStar){Star star = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),//指定用哪个类加载器,去加载生成的代理new Class[]{Star.class},//指定代理类需要实现的接口new InvocationHandler() {//指定生成的代理要干什么@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//参数1,代理对象//参数2,要调用的方法//参数3,调用方法时,传递的参数if ("sing".equals(method.getName())){System.out.println("准备话筒,收钱");} else if ("dance".equals(method.getName())) {System.out.println("准备场地,收钱");}return method.invoke(bigStar,args);}});return star;}

代理对象

public class BigStar implements Star{private String name;public BigStar() {}public BigStar(String name) {this.name = name;}@Overridepublic String sing(String name){System.out.println(this.name+"正在唱歌"+name);return "谢谢";}@Overridepublic void dance(){System.out.println(this.name+"正在跳舞");}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}public String toString() {return "BigStar{name = " + name + "}";}
}

代理对象对应准备的接口,用接口代理对象实现附加功能

public interface Star {void dance();String sing(String name);
}

测试

public static void main(String[] args) {Star proxy = ProxyUtil.createProxy(new BigStar("王宝强"));String result = proxy.sing("某某");System.out.println(result);
}

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

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

相关文章

微信小程序一键复制功能

wx.setClipboardData(Object object) 设置系统剪贴板的内容。调用成功后&#xff0c;会弹出 toast 提示"内容已复制"&#xff0c;持续 1.5s wx.setClipboardData({data: 你需要复制的内容,success (res) {wx.getClipboardData({success (res) {console.log(res.dat…

【Python网络爬虫 常见问题汇总】

目录 1. 爬取图片出现403解决办法&#xff1a;设置请求头中的Referer字段 2.关于干坏事的问题后续不定期更新 欢迎共同探讨学习进步 1. 爬取图片出现403 问题出自案例9&#xff0c;已解决。 【Python网络爬虫笔记】9- 抓取优美图库高清壁纸 当在爬取图库图片时遇到 403 错误…

Linux: docker: 怎么修改 proc下的文件内容?

文章目录 参考问题方法 1:在宿主机上修改参数方法 2:启动容器时挂载 /proc 为可写方法 3:通过 Kubernetes 调整配置方法 4:构建特权容器参考 https://docs.docker.com/security/for-admins/hardened-desktop/enhanced-container-isolation/features-benefits/#procfs–sys…

分布式 分布式事务 总结

前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言&#xff0c;一次完整的交易需要同时调动两个节…

STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?

主要问题&#xff1a; 1&#xff0c;使用STM32F103C8T6&#xff0c;模拟IIC&#xff0c;SCL和SDA口配置为推挽输出上拉&#xff0c;主要是SDA脚&#xff0c;每次都要输出输入模式重新配置&#xff0c;虽然也能通信&#xff0c;但不稳定&#xff0c;出错率大&#xff1b; 2&…

【工业机器视觉】基于深度学习的水表盘读数识别(3-数据标注与转换)

【工业机器视觉】基于深度学习的仪表盘识读&#xff08;2&#xff09;-CSDN博客 数据标注 标注扩展 Labelme 和 LabelImg 都是用于创建机器学习和计算机视觉项目所需标注数据的工具。它们都允许用户通过图形界面手动标注图像&#xff0c;但各自有其特点和适用场景。 Labelme…

静态路由与交换机配置实验

1.建立网络拓扑 添加2台计算机&#xff0c;标签名为PC0、PC1&#xff1b;添加2台二层交换机2960&#xff0c;标签名为S0、S1&#xff1b;添加2台路由器2811&#xff0c;标签名为R0、R1&#xff1b;交换机划分的VLAN及端口根据如下拓扑图&#xff0c;使用直通线、DCE串口线连接…

【Spark】Spark Join类型及Join实现方式

Spark Join类型 1. Inner Join (内连接) 示例&#xff1a;val result df1.join(df2, df1("id") df2("id"), "inner")执行逻辑&#xff1a;只返回那些在两个表中都有匹配的行。 2. Left Join (左外连接) 示例&#xff1a;val result df1.jo…

socket UDP 环路回显的服务端

基于socket通讯的方式&#xff0c;无论用http或者udp或者自定义的协议&#xff0c;程序结构都是类似的。这个以UDP协议为例简要说明。 #include <stdio.h> // 标准输入输出库 #include <sys/types.h> // 提供了一些数据类型&#xff0c;如ssize_t #include <sy…

Linux:network:添加ip的时候自动添加一个本地路由

文章目录 问题问题 最近在看一个路由的问题,顺便看内核代码,发现在添加IP的时候,内核会自动添加一个local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…

Magnet Player:一款基于Web的磁力链媒体播放器

Magnet Player&#xff1a;一款基于Web的磁力链媒体播放器 项目地址:https://gitcode.com/gh_mirrors/ma/magnet-player 是一个创新的开源项目&#xff0c;它允许用户直接在浏览器中播放磁力链&#xff08;Magnet URI&#xff09;内容&#xff0c;无需下载或安装任何桌面应用…

php:完整部署Grid++Report到php项目,并实现模板打印

一、下载Grid++Report软件 路径:开发者安装包下载 - 锐浪报表工具 二、 安装软件 1、对下载的压缩包运行内部的exe文件 2、选择语言 3、 完成安装引导 下一步即可 4、接收许可协议 点击“我接受” 5、选择安装路径 “浏览”选择安装路径,点击"安装" 6、完成…

web安全攻防入门教程

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中&#xff0c;保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现&#xff0c;还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻…

前端node环境安装:nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

需求&#xff1a;在做前端开发的时候&#xff0c;有的时候 这个项目需要 node 14 那个项目需要 node 16&#xff0c;我们也不能卸载 安装 。这岂不是很麻烦。这个时候 就需要 一个工具 来管理我们的 node 版本和 npm 版本。 下面就分享一个 nvm 工具 用来管理 node 版本。 这个…

Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?

旧版源代码地址&#xff1a;https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 旧版效果展示&#xff1a; 新版加上MeshCollider后的效果&#xff1a; 注意&#xff1a;在Unity中&#xff0c;当你动态地更改物体的Mesh时&#xff0c;通常期望…

OpenCV--特征匹配

OpenCV--特征匹配 代码和笔记 代码和笔记 import cv2 import numpy as np""" 特征匹配 """""" 暴力特征匹配&#xff1a;使用第一组&#xff08;第一幅图&#xff09;中的一个特征描述子&#xff0c;使用一些距离计算与第二组中…

什么是自动化办公

自动化办公是指使用技术工具或软件&#xff0c;通过预设流程或脚本&#xff0c;自动执行日常办公任务&#xff0c;从而提升效率、减少错误、节约时间的办公模式。它适用于需要重复性、规则明确的工作流程&#xff0c;让员工将精力集中在更具创造性和战略性的工作上。 自动化办公…

常见排序算法总结 (四) - 快速排序与随机选择

快速排序 算法思想 每一轮在数组相应的范围上随机找一个元素进行划分&#xff0c;将不大于它的所有元素都放到左边&#xff0c;将大于它的元素都放到右边。在左右两个子数组上不断地递归&#xff0c;直到整个数组上有序。 注意&#xff1a;实现时选择的时参考荷兰国旗问题优化…

unraid固态硬盘分区格式—默认1MiB对齐

背景 我的unraid中有三个机械硬盘和两个固态硬盘&#xff0c;其中两个固态硬盘组成zfs镜像的cache&#xff0c;防止其中一个硬盘出问题导致数据丢失。然而&#xff0c;今天突然看到机械硬盘的分区格式为GPT 4k&#xff0c;而固态硬盘是MBR 1MiB。想到GPT更加优秀&#xff0c;并…

Flutter 图片编辑板(一) 事件路由

一个图片编辑板&#xff0c;有两部分组成。编辑板和内容项。每一个内容项是被InteractiveViewer修饰的widget&#xff0c;具有缩放偏移的功能。 在图片编辑板上&#xff0c; 会有多个内容相&#xff0c;图片或文字&#xff08;添加文字目前还没做过&#xff09;。 当要编辑其中…