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…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
