当前位置: 首页 > news >正文

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

相关文章:

Java基础-反射

代理相关 为什么需要代理&#xff1f; 代理可以无侵入式的对方法进行增强&#xff0c;而不需要修改原始方法的代码&#xff0c;这样就可以在不修改原始方法的情况下&#xff0c;对方法进行增强。 代理长什么样子&#xff1f; 代理里面就是对象要被代理的方法 Java通过什么方式…...

计算机毕设 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…...

【转载】 Bytedance火山引擎智能拥塞控制算法 VICC

BytedanceTechBlog : 火山引擎实时、低延时拥塞控制算法的优化实践 火山引擎 网站如何利用播放器节省20%点播成本点击下面的链接进入原文:原创 翟强俊、唐辉 字节跳动技术团队 2023-10-18 11:59 发表于北京 一些专利摘要 火山引擎智能拥塞控制算法 VICC(Volcano Intelligent…...

Postman如何测试WebService接口

前言: 由于工作所需,需要使用Postman测试工具,对基于ws规范的WebService接口进行测试.在经过多种尝试后,终于找到了正确的测试方法.下面我便详细记录测试步骤,以便以后再次测试时可以拿来主义. 第一步:确保WebService服务端正常启动(注意服务端各个接口发布的url地址) 第二步…...

微服务-Eureka

文章目录 提供者与消费者Eureka注册中心搭建EurekaServer服务注册服务发现项目结构 提供者与消费者 Eureka注册中心 服务消费者该如何获取服务提供者的地址信息&#xff1f; 服务提供者启动时向eureka注册自己的信息 eureka保存这些信息 消费者根据服务名称向eureka拉取提供者信…...

超声电机工作原理

超声波电机的工作原理 在压电陶瓷振子上加高频交流电压时&#xff0c;利用逆压电效应或电致伸缩效应使定子产生微观机械振动。并将这种振动通过共振放大和摩擦耦合变换成旋转或直线型运动。 超声波驱动有两个前提条件&#xff1a; 需在定子表面激励出稳态的质点椭圆运动轨迹…...

基于人工蜂鸟优化的BP神经网络(分类应用) - 附代码

基于人工蜂鸟优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于人工蜂鸟优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.人工蜂鸟优化BP神经网络3.1 BP神经网络参数设置3.2 人工蜂鸟算法应用 4.测试结果…...

两个list中存放相同的对象,一个是页面导入,一个是从数据库查询,外部传入一个集合存放的是对象的属性名称,根据属性名称处理两个list

需求:两个list中存放相同的对象,一个是页面导入,一个是从数据库查询,外部传入一个集合存放的是对象的属性名称.要求根据传入的属性(多个)判断两个list中是否有重复的对象, 如果重复则删除数据库的list, 然后合并两个list. /*** 处理导入和数据库重复数据* param list* param l…...

为什么C++能搜到的框架介绍都好抽象?

为什么C能搜到的框架介绍都好抽象&#xff1f; 那是因为c每次都要自建生态 随便一个库发展到一定阶段&#xff0c;它就开始跨界&#xff0c;做得又大又全 结果就是&#xff0c;虽然都叫c&#xff0c;但其实是由一大堆不同生态组成的统称 c跟c的差异&#xff0c;比java跟c的差…...

人工智能(6):机器学习基础环境安装与使用

1 库的安装 整个机器学习基础阶段会用到Matplotlib、Numpy、Pandas等库&#xff0c;为了统一版本号在环境中使用&#xff0c;将所有的库及其版本放到了文件requirements.txt当中&#xff0c;然后统一安装 新建一个用于人工智能环境的虚拟环境 mkvirtualenv ai matplotlib3.8…...

电力巡检/电力抢修行业解决方案:AI+视频技术助力解决巡检监管难题

一、行业背景 随着国民经济的蓬勃发展&#xff0c;工业用电和居民用电需求迅速增加&#xff0c;电厂、变电站、输电线路高负荷运转&#xff0c;一旦某个节点发生故障&#xff0c;对生产、生活造成巨大的影响。目前电力行业生产现场人员、设备较多&#xff0c;而生产监督员有限…...

区块链轻节点的问答

EOS的nodeos并没有获取merkle proof的功能&#xff0c;那应该怎样获取merkle proof nodeos&#xff08;EOS区块链节点软件&#xff09;本身并不提供Merkle Proof的功能&#xff0c;而是全节点或其他数据源通常提供Merkle Proof。获取Merkle Proof的过程通常需要与全节点或区块浏…...

常用Web安全扫描工具汇整

漏洞扫描是一种安全检测行为&#xff0c;更是一类重要的网络安全技术&#xff0c;它能够有效提高网络的安全性&#xff0c;而且漏洞扫描属于主动的防范措施&#xff0c;可以很好地避免黑客攻击行为&#xff0c;做到防患于未然。 1、AWVS Acunetix Web Vulnerability Scanner&a…...

查看当前cmake版本支持哪些版本的Visual Studio

不同版本的的cmake对Visual Studio的版本支持不同&#xff0c;以下图示展示了如何查看当前安装的cmake支持哪些版本的Visual Studio。 1.打开cmake-gui 2.查看cmake支持哪些版本的Visual Studio...

岩土工程桥梁监测中智能振弦传感器的应用方案

岩土工程桥梁监测中智能振弦传感器的应用方案 岩土工程桥梁监测是重要的安全保障措施&#xff0c;而智能振弦传感器是其中一种有效的监测手段。它可以通过测量桥梁振动的频率和幅值&#xff0c;监测桥梁的健康状态&#xff0c;预测可能出现的问题&#xff0c;并及时采取措施进…...

上云容灾如何实现碳中和-万博智云受邀参加1024程序员节数据技术论坛并发表演讲

近日&#xff0c;2023长沙中国1024程序员节在长沙召开。 长沙中国1024程序员节继2020年后已成功连续举办三届&#xff0c;逐步成为 IT 行业引领技术前沿、推动应用创新发展的高影响力年度盛会。是 IT 领域新技术、新产品、新服务的重要发布平台。 万博智云CEO Michael受邀参加…...

蓝桥杯每日一题2023.10.26

测试次数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于本题我们可以使用动态规划来分析 dp[i][j]代表剩余i层&#xff0c;j台手机的情况下对应的测试数量 分类进行讨论一下&#xff1a; 1.当只剩下一台手机的时候&#xff0c;只能从第一层一层一层往上尝试&#xff0c…...

[已解决]安装的明明是pytorch-gpu,但是condalist却显示cpu版本,而且torch.cuda.is_available 也是flase

问题; 安装了gpu版本的pytorch&#xff0c;但是显示的torch.cuda.is_available(&#xff09;却是flase。 conda list查看 版本显示只有cpuonly 在网上找了半天&#xff0c;也没有解决办法。 仔细看了一下&#xff0c;发现&#xff0c;有个单独的包叫cpuonly&#xff0c;不知道…...

[数据分析与可视化] 基于Python绘制简单动图

动画是一种高效的可视化工具&#xff0c;能够提升用户的吸引力和视觉体验&#xff0c;有助于以富有意义的方式呈现数据可视化。本文的主要介绍在Python中两种简单制作动图的方法。其中一种方法是使用matplotlib的Animations模块绘制动图&#xff0c;另一种方法是基于Pillow生成…...

MySQL基础入门教程(InsCode AI 创作助手)

MySQL基础入门教程&#xff1a;从安装到查询 MySQL是一种广泛使用的开源关系型数据库管理系统&#xff0c;它提供了强大的数据存储和查询功能。无论是新手还是有经验的开发人员&#xff0c;本篇技术博客将带深入了解MySQL的基础知识&#xff0c;包括安装、配置、数据库操作和查…...

【Linux】 rpm安装包保存到本地并批量安装

目录 一、开启rpm安装包缓存到本地仓库 1. 修改yum.conf文件 2. 清理yum缓存 3. yum命令安装软件包 二、如何将rpm安装包保存到指定目录 方法一&#xff1a;yumdownloader 1. 安装yum-utils  2. yumdownloader命令参数说明 3. yumdownloader安装示例 方法二&#xff…...

数据分析案例-某公司员工数据信息可视化(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

浅谈wheel滚轮事件

<divonWheel{(ee) > {// new WheelEvent(自定义,e) 获取 e[wheelDelta],e[deltaY] 判断滚轮方向var e new WheelEvent(syntheticWheel,ee)console.log(滚动触发事件, e,ee);console.log(滚动触发事件e.wheelDelta, e[wheelDelta],e[deltaY]);console.log(滚动触发事件e.…...

FTP服务器操作手册

FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机&#xff0c;它们依照FTP协议提供服务。FTP协议是File Transfer Protocol(文件传输协议)&#xff0c;专门用来传输文件的协议。FTP服务器是企业里经常用到的服务器&#xff0c;今天就介绍一…...

Android使用Glide类加载服务器中的图片

Glide类用于从服务器中获取图片并加载进ImageView。 一、添加依赖 Glide为第三方框架&#xff0c;使用时需添加依赖&#xff1a; 在 Gradle Scripts / build.gradle(Module:app) / dependencies方法 中添加 implementation com.github.bumptech.glide:glide:4.12.0 添加后…...

【打靶】vulhub打靶复现系列3---Chronos

【打靶】vulhub打靶复现系列3---Chronos 一、主机探测 结合之前的方法&#xff08;arp探测、ping检测&#xff09;&#xff0c;因为我们的靶机和攻击机都在第二层&#xff0c;所以打靶时候我们更依赖arp协议 tips&#xff1a;我在运行期间发现&#xff0c;netdiscover窗口没关…...

基于Java的新闻发布管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

​CRM系统如何选型?

不少企业都想要使用CRM客户管理系统&#xff0c;但往往在CRM选型阶段就被折腾的五迷三道。CRM系统选型难在哪里&#xff1f;下面我们从企业用户和CRM厂商两方面进行分析&#xff0c;来说说关于CRM系统选型的那些事。 企业自身原因&#xff1a; 1、认知偏差 看到一个观点&…...

山东大学开发可解释深度学习算法 RetroExplainer,4 步识别有机物的逆合成路线

逆合成旨在找到一系列合适的反应物&#xff0c;以高效合成目标产物。这是解决有机合成路线的重要方法&#xff0c;也是有机合成路线设计的最简单、最基本的方法。 早期的逆合成研究多依赖编程&#xff0c;随后这一工作被 AI 接替。然而&#xff0c;现有的逆合成方法多关注单步逆…...

使用antv x6注册vue组件报错,TypeError: Object(...) is not a function (teleport.js:3:23)

typeError: Object(…) is not a function at …/…/…/node_modules/.pnpm/antvx6-vue-shape2.1.1_antvx62.15.2vue2.7.10/node_modules/antv/x6-vue-shape/es/teleport.js (teleport.js:3:23) 点击定位到报错的位置为 reactive应该是vue 2.7.*版本才有的 由于项目在index.ht…...