Java反射详细学习笔记
动态代理
特点 : 无侵入式的给代码增加额外的功能 ;
代理里面就是对象要被代理的方法 ;
通过接口保证,后面的对象和代理需要实现同一个接口 , 接口中就是被代理的所有方法 ;
如何为java对象创建一个代理 :
-
java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的方法 :
public static Object newProxyInstance(ClassLoader,Class<?>[] interfaces,InvocationHandler h) 参数一 : 用于指定用那个类加载器,去加载生成的代理类 参数二 : 指定接口,这些接口用于指定生成的代理长什么,也就是什么方法 参数三 : 用来指定生成的代理对象要干什么事情
实例代码 :
首先是一个需要代理的对象 : BigStar :
package com.it.yss;
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+"正在跳舞。") ;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
定义接口Star,指定需要被代理的方法 :
package com.it.yss;
public interface Star {// 我们可以把所有想被代理的方法定义在接口当中
// 唱歌public abstract String sing(String name) ;
// 跳舞public abstract void dance() ;
}
创建代理ProxyUtil :
package com.it.yss;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**** 类的作用 :* 创建一个代理**/
public class ProxyUtil {/*** 方法的作用 :* 给一个明星的对象 ,创建一个代理** 形参 :* 被代理的明星对象** 返回值 :* 给明星创建的代理** 需求 :* 外面的人想要大明星唱一首歌* 1 . 获取代理的对象* 代理对象 = ProxyUtil.createProxy(大明星的对象)* 2 . 再 调用代理的唱歌对象* 代理对象.唱歌的方法("歌曲的名称") ;*/public static Star createProxy(Bigstar bigstar){/*java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的方法
public static Object newProxyInstance(ClassLoader,Class<?>[] interfaces,InvocationHandler h)参数一 : 用于指定用那个类加载器,去加载生成的代理类参数二 : 指定接口,这些接口用于指定生成的代理长什么,也就是什么方法参数三 : 用来指定生成的代理对象要干什么事情
*/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 {/*** 参数一 : 代理的对象* 参数二 : 要运行的方法 sing* 参数三 : 调用sing方法时 , 传递的实参*/if("sing".equals(method.getName())){System.out.println("准备话筒 , 收钱");}else if("dance".equals(method.getName())){System.out.println("准备场地 , 收钱");}// 去找大明星唱歌或者跳舞// 代码的表现形式 : 调用大明星里面唱歌或者跳舞的方法return method.invoke(bigstar,args);}}) ;
return star ;
}
}
测试 :
package com.it.yss;
public class test {public static void main(String[] args) {
// * 需求 :
// * 外面的人想要大明星唱一首歌
// * 1 . 获取代理的对象
// * 代理对象 = ProxyUtil.createProxy(大明星的对象)
// * 2 . 再 调用代理的唱歌对象
// * 代理对象.唱歌的方法("歌曲的名称") ;// 1 . 获取代理的对象Bigstar bigstar = new Bigstar("鸡哥") ;Star proxy = ProxyUtil.createProxy(bigstar) ;
// 2 . 调用唱歌的方法String result = proxy.sing("只因你太美") ;System.out.println(result);
// 3 . 调用跳舞的方法proxy.dance();}
}
调用步骤 :
反射
概念 :
反射 :
反射允许对封装类的成员变量,成员方法和构造方法的信息进行编程访问 ;
一个类包括 :
-
字段(成员变量)
-
构造方法
-
成员方法
而反射就可以将这些获取出来 , 例如idea中的类方法或构造函数参数提示就是依靠反射实现的 :
获取class对象的三种方式 :
-
Class.forName("全类名")
-
类名.class
-
对象.getClass() ;
代码实例 :
package com.it.yss;
public class MyReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {/*** 获取class对象的三种方式 :* 1. Class.forName("全类名")* 2. 类名.class* 3. 对象.getClass() ;*/// 1. 第一种方式// 全类名 : 包名 + 类名 com.it.yss.Student// 最为常用的Class Clazz = Class.forName("com.it.yss.Student");// 打印 :System.out.println(Clazz);
// 2 .第二种方式// 一般更多的是当作参数进行传递Class Clazz2 = Student.class ;System.out.println(Clazz2==Clazz);
// 3 . 第三种方式// 当有了这个类的对象的时候 , 才能使用Student stu = new Student();Class Clazz3 = stu.getClass();System.out.println(Clazz3==Clazz2);}
}
可以看到全是相等的 ,输出结果 :
class com.it.yss.Student
true
true
在java中 , 万事皆可看作对象 :
获取构造方法 :
实例 :
Student类 :
package com.it.myreflect2;
public class Student {private String name ;private int age;
public Student() {}
public Student(String name){this.name = name;}
public Student(int age){this.age = age;}
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;}
@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
1 . 获取字节码文件对象 :
Class clazz = Class.forName("com.it.myreflect2.Student");
2 . 获取构造方法
// 2 . 2 获取所有构造方法Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor c : cons2) {System.out.println(c);}
System.out.println("------------------------");
// 2 . 3 获取空参构造方法Constructor con1 = clazz.getDeclaredConstructor() ;System.out.println(con1);
System.out.println("------------------------");
// 2 . 4 获取对应的构造方法(传入对应参数的字节码文件)Constructor con2 = clazz.getDeclaredConstructor(String.class);System.out.println(con2);Constructor con3 = clazz.getDeclaredConstructor(int.class);System.out.println(con3);Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);System.out.println(con4);
System.out.println("------------------------");
输出结果 :
public com.it.myreflect2.Student()
public com.it.myreflect2.Student(java.lang.String)
------------------------
public com.it.myreflect2.Student()
public com.it.myreflect2.Student(java.lang.String)
protected com.it.myreflect2.Student(int)
private com.it.myreflect2.Student(java.lang.String,int)
------------------------
public com.it.myreflect2.Student()
------------------------
public com.it.myreflect2.Student(java.lang.String)
protected com.it.myreflect2.Student(int)
private com.it.myreflect2.Student(java.lang.String,int)
------------------------
3 . 获取构造方法修饰权限符
// 3 获取方法修饰权限符
int modifiers = con4.getModifiers();
System.out.println(modifiers);
System.out.println("------------------------");
这里输出结果是2 , 看api文档可以发现2对应的是private ;
4 . 获取构造方法参数
用con.getParameters()来获得对应的参数列表 :
Parameter[] parameters = con4.getParameters();
for (Parameter p : parameters) {System.out.println(p);
}
输出结果 :
java.lang.String arg0
int arg1
5 . 用反射创建对象
// 暴力反射 : 临时取消权限校验(原本是私有构造方法)
con4.setAccessible(true);
// 创建对象
Student stu = (Student) con4.newInstance("张三",23);
System.out.println(stu);
输出结果 :
Student{name='张三', age=23}
利用反射获取成员变量
Student类 :
package com.it.myreflect3;
public class Student {private String name ;private int age;public String gender ;public Student() {}public Student(int age, String gender, String name) {this.age = age;this.gender = gender;this.name = name;}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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}
1 . 获取成员变量 :
// 2 . 获取成员变量Field[] fields1 = clazz.getFields() ;//获取公共Field[] fields2 = clazz.getDeclaredFields() ;// 获取所有for(Field f : fields1){System.out.println(f);}System.out.println("--------------");for(Field f : fields2){System.out.println(f);}System.out.println("--------------");// 获取单个成员变量Field gender = clazz.getDeclaredField("gender");System.out.println(gender);
输出结果 :
public java.lang.String com.it.myreflect3.Student.gender
--------------
private java.lang.String com.it.myreflect3.Student.name
private int com.it.myreflect3.Student.age
public java.lang.String com.it.myreflect3.Student.gender
--------------
public java.lang.String com.it.myreflect3.Student.gender
2 . 获取权限修饰符
int modifiers = gender.getModifiers();
System.out.println(modifiers);
输出结果 :
1
1代表public
3 . 获取成员变量,类型
String ys = gender.getName() ;
System.out.println(ys);
Class<?> type = gender.getType();
System.out.println(type);
输出结果 :
gender
class java.lang.String
4 . 获取成员变量记录的值
Student s = new Student(23,"男","张三");
Object value = gender.get(s) ;
System.out.println(value);
输出结果 :
男
5 . 修改对象里面记录的值
gender.set(s,"女");
System.out.println(s);
输出结果 :
Student{name='张三', age=23, gender='女'}
获取成员方法
Student类 :
package com.it.myreflect4;
import java.io.IOException;
public class Student {private String name ;private int age;
public Student() {}
private Student(String name, int age) {this.name = name;this.age = age ;}
public void sleep(){System.out.println("睡觉");}
private String eat(String food) throws IOException {System.out.println("在吃"+food);return "奥里给" ;}
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;}
@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
注 : 多加了eat()和sleep();
完整代码 :
package com.it.myreflect4;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {// 1 . 获取字节码文件对象Class clazz = Class.forName("com.it.myreflect4.Student");
// 2 . 获取所有的方法对象(包含父类中所有的公共方法)Method[] methods= clazz.getMethods();for(Method method:methods){System.out.println(method);}
//获取所有的方法对象(不能获取父类的,但是可以获取本类中私有的方法)Method[] methods1= clazz.getDeclaredMethods();for(Method method:methods1){System.out.println(method);}
// 获取指定的单一方法Method m = clazz.getDeclaredMethod("eat", String.class) ;System.out.println(m);
// 获取方法的修饰符int modify = m.getModifiers();System.out.println(modify);
// 获取方法的名字String name = m.getName() ;System.out.println(name);
// 获取方法的形参Parameter[] ps = m.getParameters();for(Parameter p : ps){System.out.println(p);}
// 获取方法抛出的异常 :Class[] exceptionTypes = m.getExceptionTypes();for(Class exceptionType : exceptionTypes){System.out.println(exceptionType);}
// 方法运行/*Method类中用于创建对象的方法Object invoke(Object obj,Object... args): 运行方法参数一 : 用obj对象调用该方法参数二 : 调用方法的传递的参数(如果没有就不写)返回值: 方法的返回值(如果没有就不写)*/Student s = new Student() ;m.setAccessible(true);String ts = (String) m.invoke(s, "汉堡包");System.out.println(ts);
}
}
输出结果 :
public java.lang.String com.it.myreflect4.Student.getName()
public java.lang.String com.it.myreflect4.Student.toString()
public void com.it.myreflect4.Student.sleep()
public void com.it.myreflect4.Student.setName(java.lang.String)
public int com.it.myreflect4.Student.getAge()
public void com.it.myreflect4.Student.setAge(int)
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public java.lang.String com.it.myreflect4.Student.getName()
public java.lang.String com.it.myreflect4.Student.toString()
public void com.it.myreflect4.Student.sleep()
public void com.it.myreflect4.Student.setName(java.lang.String)
private java.lang.String com.it.myreflect4.Student.eat(java.lang.String) throws java.io.IOException
public int com.it.myreflect4.Student.getAge()
public void com.it.myreflect4.Student.setAge(int)
private java.lang.String com.it.myreflect4.Student.eat(java.lang.String) throws java.io.IOException
2
eat
java.lang.String arg0
class java.io.IOException
在吃汉堡包
奥里给
反射的作用
-
获取一个类里面的所有的信息 , 获取到之后,再执行其它的业务逻辑
-
结合配置文件,动态的创建对象并调用方法
总结 :
相关文章:

Java反射详细学习笔记
动态代理 特点 : 无侵入式的给代码增加额外的功能 ; 代理里面就是对象要被代理的方法 ; 通过接口保证,后面的对象和代理需要实现同一个接口 , 接口中就是被代理的所有方法 ; 如何为java对象创建一个代理 : java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的…...

区块链在艺术市场中的创新:数字艺术品的溯源与版权保护
随着数字技术的迅猛发展,数字艺术品正逐渐成为艺术市场的重要组成部分。然而,数字艺术品的复制和版权问题日益突出,传统的版权管理方式面临挑战。区块链技术作为一种去中心化的分布式账本技术,为解决这些问题提供了新的可能性。本…...

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量
文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势:挑战: 《CSS创意项目实践&…...

鸿蒙界面开发
界面开发 //构建 → 界面 build() {//行Row(){//列Column(){//文本 函数名(参数) 对象.方法名(参数) 枚举名.变量名Text(this.message).fontSize(40)//设置文本大小.fontWeight(FontWeight.Bold)//设置文本粗细.fontColor(#ff2152)//设置文本颜色}.widt…...
【JavaScript】use strict
“use strict” 声明时,代码将会在严格模式下执⾏。严格模式包含了⼀些额外的规则和限制。 使⽤ “use strict” 的主要作⽤包括: 变量必须声明后再使⽤,不能通过不使⽤关键字创建全局变量不能通过 delete 操作符删除变量(包括对…...

Linux云计算 |【第一阶段】SERVICES-DAY3
主要内容: 分离解析介绍、NTP时间服务、基础邮件服务(MX记录)、部署postfix邮件服务器、自定义YUM仓库 实操提前准备: ① 设置SELinux、关闭防火墙服务(两台主机) [rootsvr7 ~]# getenforce Permissive …...

Java面试八股之Spring-boot-starter-parent的作用是什么
Spring-boot-starter-parent的作用是什么 spring-boot-starter-parent 是Spring Boot项目中的一个特殊POM(Project Object Model),它主要的作用是提供一系列默认的配置和依赖管理,以便简化项目的构建过程。以下是spring-boot-sta…...
Python 和 Boto3 生成 Amazon S3 对象的 HTTPS URL
在使用 Amazon S3 存储服务时,我们经常需要获取存储桶中对象的 HTTPS URL。这篇博文将详细介绍如何使用 Python 和 Boto3 库来实现这一功能。 背景 Amazon S3(Simple Storage Service)是一种广泛使用的云存储服务。在许多场景中,我们需要获取 S3 存储桶中对象的公开访问 …...
V-bind动态绑定style的案例集合
目录 绑定对象 绑定数组 绑定函数 V-bind 动态绑定 Class 的案例集合-CSDN博客 绑定对象 示例代码如下: <!--html--> <p :style="{width:widthVal,height:heightVal,border:borderVal}">段落</p> <!--js--> data(){ ret…...
深度学习守护夜行安全:夜视行人检测系统详解
基于深度学习的夜视行人检测系统(UI界面YOLOv8/v7/v6/v5代码训练数据集) 引言 夜视行人检测在自动驾驶和智能监控中至关重要。然而,由于光线不足,夜间行人检测面临巨大挑战。深度学习技术,特别是YOLO(You…...

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践
7月12日,第13届PostgreSQL中国技术大会在杭州顺利举办,亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上,亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲…...
如何减少白屏的时间
前端性能优化是前端开发中一个重要环节,它包括很多内容,其中页面的白屏时间是用户最初接触到的部分,白屏时间过长会显著影响用户的留存率和转换率。 我们以一个 APP 内嵌 Webview 打开页面作为例子,来分析页面打开过程以及可优化…...

科研成果 | 高精尖中心取得高性能区块链交易调度技术突破
近日,未来区块链与隐私计算高精尖创新中心研究团队在区块链交易效率方面取得突破性进展,最新成果“高性能区块链交易调度引擎”首次为长安链带来高并行度的交易调度,充分利用现有计算资源,显著提升长安链交易处理速度。 随着区块…...

go语言学习文档精简版
Go语言是一门开源的编程语言,目的在于降低构建简单、可靠、高效软件的门槛。Go平衡了底层系统语言的能力,以及在现代语言中所见到的高级特性。 你好,Go package main // 程序组织成包import "fmt" // fmt包用于格式化输出数据// …...
立元科技-Java面经
面试时间:2024年2月13日 面试地点:线下 面试流程:一轮面试 首先写了点笔试题,但是人家根本不看(这个也就一面) (聊的还行,但是公司环境不是特别的好,一次面试&#x…...

OpenGL入门第六步:材质
目录 结果显示 材质介绍 函数解析 具体代码 结果显示 材质介绍 当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,…...

新版SpringSecurity5.x使用与配置
目录 一、了解SpringSecurity 1.1 什么是Spring Security? 1.2 Spring Security功能 1.3 Spring Security原理 1.4 RABC (Role-Based Access Control) 二、SpringSecurity简单案例 2.1 引入SpringSecurity依赖 2.2 创建一个简单的Controller 三、SpringSecu…...
JavaScript实战 - JavaScript 中实现线程锁
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 前言: …...

基于PaddleClas的人物年龄分类项目
目录 一、任务概述 二、算法研发 2.1 下载数据集 2.2 数据集预处理 2.3 安装PaddleClas套件 2.4 算法训练 2.5 静态图导出 2.6 静态图推理 三、小结 一、任务概述 最近遇到个需求,需要将图像中的人物区分为成人和小孩,这是一个典型的二分类问题…...

20240725java的Controller、DAO、DO、Mapper、Service层、反射、AOP注解等内容的学习
在Java开发中,controller、dao、do、mapper等概念通常与MVC(Model-View-Controller)架构和分层设计相关。这些概念各自承担着不同的职责,共同协作以构建和运行一个应用程序。以下是这些概念的解释:…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...

ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...

Ray框架:分布式AI训练与调参实践
Ray框架:分布式AI训练与调参实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Ray框架:分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...