Java笔记_22(反射和动态代理)
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对象的三种方式
- Class.forName(“全类名”);
全类名:包名+类名
- 类名.class
- 对象.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.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
相关文章:

Java笔记_22(反射和动态代理)
Java笔记_22 一、反射1.1、反射的概述1.2、获取class对象的三种方式1.3、反射获取构造方法1.4、反射获取成员变量1.5、反射获取成员方法1.6、综合练习1.6.1、保存信息1.6.2、跟配置文件结合动态创建 一、反射 1.1、反射的概述 什么是反射? 反射允许对成员变量,成…...

前端web入门-HTML-day01
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 HTML初体验 HTML 定义 标签语法 总结: HTML 基本骨架 基础知识: 总结&#…...

创建一个Go项目
创建一个Go项目 1.创建项目 package mainfunc main() {println("你好啊,简单点了!") }如果是本地的话可以采用go run 项目名的方式。 可以采用go run --work 项目名的方式,此时可以展示日志信息。 如果是只编译的话 go build 项…...

从 Spring 的创建到 Bean 对象的存储、读取
目录 创建 Spring 项目: 1.创建一个 Maven 项目: 2.添加 Spring 框架支持: 3.配置资源文件: 4.添加启动类: Bean 对象的使用: 1.存储 Bean 对象: 1.1 创建 Bean: 1.2 存储 B…...

【一文吃透归并排序】基本归并·原地归并·自然归并 C++
目录 1 引入情境基本归并排序实现 C 2 原地归并排序2-1 死板的解法2-2 原地工作区2-3 链表归并排序 3 自底向上归并排序4 两路自然归并排序4-1 形式化描述4-2 代码实现 1 引入情境 归并思想:假设有两队小孩,都是从矮到高排序,现在通过一扇门后…...

读《Spring Boot 3核心技术与最佳实践》有感
我是谁? 👨🎓作者:bug菌 ✏️博客:CSDN、掘金、infoQ、51CTO等 🎉简介:CSDN/阿里云/华为云/51CTO博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者&am…...

板子短路了?
有段时间没更新了,主要是最近有点忙,当然也因为有点“懒”。 做这行业的都知道,下半年都是比较忙的,相信大家也是! 相信做硬件的小伙伴们,遇到过短路的板子已经不计其数了。 短路带来的危害:…...

一行代码绘制高分SCI限制立方图
一、概述 Restricted cubic splines (RCS)是一种基于样条函数的非参数化模型,它可以可靠地拟合非线性关系,可以自适应地调整分割结点。在统计学和机器学习领域,RCS通常用来对连续型自变量进行建模,并在解释自变量与响应变量的关系…...

spring 容器结构/机制debug分析--Spring 学习的核心内容和几个重要概念--IOC 的开发模式--综合解图
目录 Spring Spring 学习的核心内容 解读上图: Spring 几个重要概念 ● 传统的开发模式 解读上图 ● IOC 的开发模式 解读上图 代码示例—入门 xml代码 注意事项和细节 1、说明 2、解释一下类加载路径 3、debug 看看 spring 容器结构/机制 综合解图 Spring Spr…...

excel实战小测第四
【项目背景】 本项目为某招聘网站部分招聘信息,要求对“数据分析师”岗位进行招聘需求分析,通过对城市、行业、学历要求、薪资待遇等不同方向进行相关性分析,加深对数据分析行业的了解。 结合企业真实招聘信息,可以帮助有意转向数…...

什么是SpringBoot自动配置
概述: 现在的Java面试基本都会问到你知道什么是Springboot的自动配置。为什么面试官要问这样的问题,主要是在于看你有没有对Springboot的原理有没有深入的了解,有没有看过Springboot的源码,这是区别普通程序员与高级程序员最好的…...

基于IC5000烧录器使用winIDEA烧写+调试程序(S32K324的软件烧写与调试)
目录 一、iSYSTEM简介二、如何使用iSYSTEM winIDEA烧写调试程序2.1 打开winIDEA:2.2 新建一个Workspace;2.3 硬件配置:2.4 选择CPU芯片型号:2.5 加载烧写文件:2.6 开始烧录程序:2.7 程序调试Debug:2.7.1 运行程序&…...

新手开始学【网络安全】要怎么入门?
前言:网络安全如何从零开始学习,少走弯路? 目录: 一,怎么入门? 1、Web 安全相关概念(2 周)2、熟悉渗透相关工具(3 周)3、渗透实战操作(5 周&…...

Linux指令 快捷键
热键 上一次我们说到了linux的基本指令,这次我们先说一下热键 TAB TAB键在linux中有什么作用呢?? 在Linux中,假设我们想要输入的指令忘记了,我们可以TAB两下,帮我们补全命令或者假如命令太多࿰…...
Testing and fault tolerence考试要点
文章目录 ATPGFault modelScanFunctional testMemory BISTLogic BISTboundary scanATEIddq testingFault tolerant designRisk analysis ATPG ATPG工作流程fault collapsing的原则 Fault model 有哪些fault model以及他们的工作原理 Scan Scan寄存器结构Scan Chain的连接方…...

记一次springboot项目漏洞挖掘
前言 前段时间的比赛将该cms作为了题目考察,这个cms的洞也被大佬们吃的差不多了,自己也就借此机会来浅浅测试下这个cms残余漏洞,并记录下这一整个流程,谨以此记给小白师傅们分享下思路,有错误的地方还望大佬们请以指正…...

R语言 | 数据框
目录 一、认识数据框 7.1 建立第一个数据框 7.2 验证与设定数据框的列名和行名 二、认识数据框的结构 三、获取数据框内容 3.1 一般获取 3.2 特殊字符$ 3.3 再看取得的数据 四、使用rbind()函数增加数据框的行数据 五、使用cbind()函数增加数据框的列数据 5.1 使用$符号…...

基于SpringBoot的招生管理系统的设计与实现
背景 本次设计任务是要设计一个招生管理系统,通过这个系统能够满足管理员和学生的招生公告管理功能。系统的主要功能包括首页、个人中心、学生管理、专业信息管理、专业报名管理、录取通知管理、系统管理等功能。 管理员可以根据系统给定的账号进行登录࿰…...

Oracle Profile详解
Profile的作用主要表现在三个方面 1、密码策略 2、对用户所能使用的资源进行管理 3、profile存放在数据字典里面,默认有一个名字为default的profile set linesize 160 set pagesize 30 select resource_name,resource_type,limit from dba_profiles where profile‘…...
r语言tidyverse教程:5 字符串处理stringr
文章目录 R语言系列: 编程基础💎循环语句💎向量、矩阵和数组💎列表、数据帧排序函数💎apply系列函数tidyverse:readr💎tibble💎tidyr💎dplyr💎stringr stri…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...