Java基础-反射

代理相关

为什么需要代理?

代理可以无侵入式的对方法进行增强,而不需要修改原始方法的代码,这样就可以在不修改原始方法的情况下,对方法进行增强。

代理长什么样子?

代理里面就是对象要被代理的方法

Java通过什么方式来保证代理的样子?

通过接口保证,后面的对象和代理需要实现同一个接口,接口中就是被代理的所有方法

代码演示:

  1. BigStar.java
public class BigStar implements Star {private String name;@Overridepublic String sing(String name) {System.out.println(this.name + "正在唱" + name);return name;}@Overridepublic void dance() {System.out.println(this.name + "正在跳舞");}//...
}
  1. Star接口
public interface Star {//把需要被代理的方法定义在接口中String sing(String name);void dance();}
  1. 代理工具

public class ProxyUtil {/*** 作用:给一个明星对象创建代理* 形参:被代理的明星对象* 返回值:给明星创建的代理* <p>* 需求:外面的人需要大明星唱一首歌*/public static Star createProxy(BigStar bigStar) {Star star = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), //参数一:类加载器new Class[]{Star.class}, //参数二:被代理类的所有接口//参数三:代理对象的调用处理程序new InvocationHandler() {@Overridepublic Object invoke(Object o, Method method, Object[] args) throws Throwable {/*参数一:代理对象参数二:被代理的方法参数三:被代理方法的参数*/if ("sing".equals(method.getName())) {System.out.println("准备话筒,收钱");} else if ("dance".equals(method.getName())) {System.out.println("准备舞台,收钱");}//执行被代理的方法//返回被代理方法的返回值return method.invoke(bigStar, args);}});return star;}
}
  1. 测试类
public class Test {public static void main(String[] args) {BigStar star = new BigStar("蔡徐坤");Star proxy = ProxyUtil.createProxy(star);String result = proxy.sing("只因你太美");System.out.println(result);}
}

反射

什么是反射?

反射允许对成员变量,成员方法和构造方法的信息进行编程访问

获取反射三种方式

public class Test {public static void main(String[] args) throws Exception {//第一种方式://最为常用的方式,通过类的全路径,获取Class对象Class clazz = Class.forName("com.cxk.fanshe.Student");//第二种方式,更多的是当作参数传递Class clazz2 = Student.class;//第三种方式//当我们已经有了这个类的对象,才可以使用Student student = new Student();Class clazz3 = student.getClass();}
}

反射获取构造方法

Declared表示私有

方法名说明
Constructor<?>[] getConstructors()获得所有的构造(只能public修饰)
Constructor<?>[] getDeclaredConstructors()获得所有的构造(包含private修饰)
Constructor getConstructor(Class<?>… parameterTypes)获取指定构造(只能public修饰)
Constructor getDeclaredConstructor(Class<?>… parameterTypes)获取指定构造(包含private修饰)

Demo

public class Test {public static void main(String[] args) throws Exception {//1.获取class字节码文件对象Class<?> clazz = Class.forName("com.cxk.fanshe.Student");//2.1获取所有的构造方法Constructor[] con1 = clazz.getDeclaredConstructors();for (Constructor constructor : con1) System.out.println(constructor);//2.2获取指定的构造方法Constructor con2 = clazz.getDeclaredConstructor(); //空参Constructor con3 = clazz.getDeclaredConstructor(String.class, Integer.class); //有参int modifiers = con3.getModifiers();        //获取权限修饰符Parameter[] parameters = con3.getParameters();//获取参数列表con3.setAccessible(true);//暴力反射 无视权限修饰符 这样就可以访问私有构造方法了Student cxk =(Student) con3.newInstance("cxk", 23);//创建对象}
}

获取成员变量

方法名说明
Field[] getFields()返回所有成员变量对象的数组(只能拿public的)
Field[] getDeclaredFields()返回所有成员变量对象的数组,存在就能拿到
Field getField(String name)返回单个成员变量对象(只能拿public的)
Field getDeclaredField(String name)返回单个成员变量对象,存在就能拿到

Demo:

public class Test {public static void main(String[] args) throws Exception {//1.获取class字节码文件对象Class clazz = Class.forName("com.cxk.fanshe.Student");Field[] fields = clazz.getDeclaredFields();//获取成员变量 所有的Field age = clazz.getDeclaredField("age");//获取单个的int modifiers = age.getModifiers();//获取权限修饰符Class type = age.getType();//获取数据类型String name = age.getName();//获取变量名Student cxk = new Student("cxk", 30);age.setAccessible(true);//暴力反射Integer value =(Integer) age.get(cxk);System.out.println(value);age.set(cxk, 18);//修改已记录的值System.out.println(cxk);}
}

获取成员方法

方法名说明
Method[] getMethods()返回所有成员方法对象的数组(只能拿public的)
Method[] getDeclaredMethods()返回所有成员方法对象的数组,存在就能拿到
Method getMethod(String name, Class<?>… parameterTypes)返回单个成员方法对象(只能拿public的)
Method getDeclaredMethod(String name, Class<?>… parameterTypes)返回单个成员方法对象,存在就能拿到

Demo:

public class Test {public static void main(String[] args) throws Exception {//1.获取class字节码文件对象Class clazz = Class.forName("com.cxk.fanshe.Student");Method[] methods1 = clazz.getMethods(); //获取所有的方法(包括父类)Method[] methods = clazz.getDeclaredMethods();//获取所有的方法(不能获取父类)Method eat = clazz.getMethod("eat", String.class);//获取单一方法int modifiers = eat.getModifiers();//获取方法的修饰符String name = eat.getName();//获取方法的名称int parameterCount = eat.getParameterCount();//获取方法的参数个数Class returnType = eat.getReturnType();//获取方法的返回值类型Parameter[] parameters = eat.getParameters();//获取方法的参数列表Class[] parameterTypes = eat.getParameterTypes();//获取方法的参数类型列表Student cxk = new Student("cxk", 30);eat.setAccessible(true);//暴力反射 使私有方法可以被访问String apple =(String) eat.invoke(cxk, "apple");//执行方法}
}

利用反射保存对象信息

Demo:

public class Test {public static void main(String[] args) throws  Exception {/*对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去*/Student s = new Student("小A",23,'女',167.5,"睡觉");Teacher t = new Teacher("播妞",10000);saveObject(s);saveObject(t);}//把对象里面所有的成员变量名和值保存到本地文件中public static void saveObject(Object obj) throws  Exception {//1.获取字节码文件的对象Class clazz = obj.getClass();//2. 创建IO流BufferedWriter bw = new BufferedWriter(new FileWriter("./a.txt"));//3. 获取所有的成员变量Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);//获取成员变量的名字String name = field.getName();//获取成员变量的值Object value = field.get(obj);//写出数据bw.write(name + "=" + value);bw.newLine();}bw.close();}
}

学生类:

public class Student {private String name;private int age;private char gender;private double height;private String hobby;
}

教师类:

public class Teacher {private String name;private double salary;
}

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

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

相关文章

RCE 远程代码执行漏洞分析

RCE 漏洞 1.漏洞描述 Remote Command/Code Execute 远程命令执行/远程代码执行漏洞 这种漏洞通常出现在应用程序或操作系统中&#xff0c;攻击者可以通过利用漏洞注入恶意代码&#xff0c;并在受攻击的系统上执行任意命令。 2.漏洞场景 PHP 代码执行PHP 代码注入OS 命令执…

Kettle循环结果集中的数据并传入SQL组件【或转换】里面

简介&#xff1a;在尝试使用了结果集的Demo循环后&#xff0c;进入到生产还是有一点问题的&#xff0c;以下是各个组件的分解解释、遇到的问题&#xff0c;以及解决问题的思路&#xff0c;最后文章的最后会把完整的Ktr文件放出来。记得收藏点赞喔&#xff01; 先来看张图~来自…

Web界面自动化操作工具 - Selenium常见用法

Selenium是一个用于自动化浏览器操作的工具&#xff0c;常用于Web应用程序的测试和爬虫开发。 下面是一些Python Selenium的常见用法和代码示例&#xff1a; 1. 导入Selenium库和WebDriver&#xff1a; from selenium import webdriver2. 创建WebDriver实例&#xff1a; # …

OSPF的网络类型

1.3配置OSPF的网络类型 1.3.1实验3&#xff1a;配置P2P网络类型 实验需求 实现单区域OSPF的配置实现通过display命令查看OSPF的网络类型 实验拓扑 实验拓扑如图1-11所示 图1-11 配置P2P网络类型 实验步骤 步骤1&#xff1a;[1] 配置IP地址 路由器R1[2] 的配置 <Huawe…

Redis - Python 客户端基本使用指南

概述 参考&#xff1a;python 模块Redis模块&#xff0c;连接Redis数据库 Python 中的 Redis 客户端库允许开发者与 Redis 数据库进行交互。这些库允许在 Python 中连接到 Redis、执行命令以读取或写入数据&#xff0c;并处理 Redis 数据。 以下是一些常见的 Python Redis 客…

html iframe 框架有哪些优缺点?

目录 前言&#xff1a; 用法&#xff1a; 理解&#xff1a; 优点&#xff1a; 嵌套外部内容&#xff1a; 独立性&#xff1a; 分离安全性&#xff1a; 跨平台兼容性&#xff1a; 方便维护&#xff1a; 缺点&#xff1a; 性能开销&#xff1a; 用户体验问题&#xf…

vue项目中内嵌iframe,打包上线时候iframe地址如何写?

vue项目中内嵌iframe&#xff0c;打包上线时候iframe地址如何写 一、项目结构1.内嵌的iframe文件位置2.打包后的iframe的位置 二、代码 前提描述&#xff0c;项目是用webpack打包的&#xff0c;内嵌一个完整的js小组件 一、项目结构 1.内嵌的iframe文件位置 2.打包后的iframe的…

图论05-【无权无向】-图的广度优先BFS遍历-路径问题/检测环/二分图/最短路径问题

文章目录 1. 代码仓库2. 单源路径2.1 思路2.2 主要代码 3. 所有点对路径3.1 思路3.2 主要代码 4. 联通分量5. 环检测5.1 思路5.2 主要代码 6. 二分图检测6.1 思路6.2 主要代码6.2.1 遍历每个联通分量6.2.2 判断相邻两点的颜色是否一致 7. 最短路径问题7.1 思路7.2 代码 1. 代码…

听GPT 讲Rust源代码--library/std(2)

File: rust/library/std/src/sys_common/wtf8.rs 在Rust源代码中&#xff0c;rust/library/std/src/sys_common/wtf8.rs这个文件的作用是实现了UTF-8编码和宽字符编码之间的转换&#xff0c;以及提供了一些处理和操作UTF-8编码的工具函数。 下面对这几个结构体进行一一介绍&…

wkhtmltoimage/wkhtmltopdf 使用实践

1. 介绍 wkhtmltopdf/wkhtmltoimage 用于将简单的html页面转换为pdf或图片&#xff1b; 2.安装 downloads 2.1. mac os 下载64-bit 版本然后按照指示安装, 遇到 untrust developers 时&#xff0c;需要在 Settings -> Privacy 处信任下该安装包。 2.2. debian # 可用…

【完美世界】被骂国漫之耻,石昊人设战力全崩,现在真成恋爱世界了

【侵权联系删除】【文/郑尔巴金】 深度爆料&#xff0c;《完美世界》动漫第135集预告片已经更新了&#xff0c;但是网友们对此却是一脸槽点。从预告中可以看出&#xff0c;石昊在和战王战天歌的大战中被打成重伤&#xff0c;最后云曦也被战天歌抓住。在云曦面临生死危机的时候…

SRAM与DRAM的区别

目录 SRAM 特点 应用场景 DRAM 特点 应用场景 SRAM和DRAM的区别 SRAM SRAM&#xff08;静态随机存取存储器&#xff09;是一种用于存储和检索数据的类型的计算机内存。SRAM的存储单元通过触发器&#xff08;flip-flop&#xff09;实现&#xff0c;它们可以保持数据的状态…

linux-文件系统

目录 一、文件系统 1.分区 2.文件系统分类 3.文件系统创建工具 4.查看文件系统的属性 5.挂载 6.buffer和cache 一、文件系统 1.分区 1-4个主分区 第五个序号开始&#xff0c;是逻辑分区 2.文件系统分类 vfs文件系统 ------------- virtualenv file System&#xff0…

Tensorboard安装及简单使用

Tensorboard 1. tensorboard 简单介绍2. 安装必备环境3. Tensorboard安装4. 可视化命令 1. tensorboard 简单介绍 TensorBoard是一个可视化的模块&#xff0c;该模块功能强大&#xff0c;可用于深度学习网络模型训练查看模型结构和训练效果&#xff08;预测结果、网络模型结构…

Uniapp 酷炫钱包页面模板 直接引用

使用教程 直接引用Vue页面 即可 <template><view><TCqianbao></TCqianbao></view> </template> <script>import TCqianbao from /uni_modules/TC-qianbao/pages/index.vueexport default {components:{TCqianbao},} </script&…

UVM 验证方法学之interface学习系列文章(八)《interface不小心引入X态问题》

前面的文章学习,想必大家都对interface 有了深入了解。大家可不要骄傲哦,俗话说:小心驶得万年船。今天,再给大家介绍一个工作中,不是经常遇到,但是一旦遇到,会让你纠结很久的事情。 前面文章提到,随着验证复杂度的不断增加,interface 的bind 的操作,是必不可少的用法…

asp.net网上商城系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio协同过滤设计

一、源码特点 asp.net网上商城系统是一套完善的web设计管理系统系统采用协同过滤算法进行商品推荐&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库 为sqlserver2008&#xff0c;使用c#语言开发 ASP…

RK356X/RK3588构建Ubuntu20.04根文件系统

文章目录 前言一、官网下载ubuntu-base二、挂载并构建文件系统2.1、配置构建文件系统环境2.2、编写挂载脚本mount.sh并安装相关工具2.3、轻量级的桌面环境 lubuntu-desktop2.4、卸载一些不必要的软件2.5、添加用户2.6 、允许root用户登录桌面2.7、串口自动登录2.8、添加分区释放…

阿里云对象存储OSS文件无法预览,Bucket设置了Referer

您发起的请求头中没有Referer字段或Referer字段为空&#xff0c;与请求Bucket设置的防盗链策略不相符。 解决方案 您可以选择以下任意方案解决该问题。 在请求中增加Referer请求头。 GET /test.txt HTTP/1.1 Date: Tue, 20 Dec 2022 08:48:18 GMT Host: BucketName.oss-examp…

springboot actuator 常用接口

概述 微服务作为一项在云中部署应用和服务的新技术是当下比较热门话题&#xff0c;而微服务的特点决定了功能模块的部署是分布式的&#xff0c;运行在不同的机器上相互通过服务调用进行交互&#xff0c;业务流会经过多个微服务的处理和传递&#xff0c;在这种框架下&#xff0…