反射学习总结 --为理解SpringMVC底层做准备
反射是什么?
通俗理解 - 照X光。
java:一个类在反射面前就像照X光,清清楚楚明明白白。
应用:我们的ide中,能够"."一下就知道类中的所有方法就是通过反射实现的。
XML中配置的class全路径动态生成类。(框架)
程序在运行过程中,动态的创建对象。
-- 只要知道类的名称,就可以利用他的字节码对象来创建该类的一个对象。
何为class对象:
HelloWorld.java
通过 javac HelloWorld.java ----->HelloWorld.class(字节码文件) ---> java HelloWorld jvm把HelloWorld.class加载到内存中,变成Class对象
关于Class的加载:
public static void main(String[] args) {
Person p = new Person();
Class pClassclass = p.getClass();
System.out.println(pClassclass);
Person person = new Person("aa", "18", "USA");
Class personClass = person.getClass();
System.out.println(personClass);
System.out.println(pClassclass == personClass); //true 字节码文件在程序运行过程中,只会被加载到内存中一次
}
获取Class的三种方法: p.getClass(), Person.class, Class.forName("类名全路径")
public static void main(String[] args) throws ClassNotFoundException {
Person p = new Person();
Class p1 = p.getClass();
Person person = new Person("aa", "18", "USA");
Class p2 = person.getClass();
System.out.println(p1 == p2);
Class<Person> p3 = Person.class;
System.out.println(p3 == p1);
Class<?> p4 = Class.forName("com.java.demo.clazz.Person");
System.out.println(p4 == p3);
}
无论是哪一种,字节码都只有一个
使用Class
先看下类和字节码对象的关系

关于构造方法:
方式一:用newInstance()方法
class.newInstance(),时,newInstance()底层需要调用无参的构造方法,所以,我们被反射的类中,需要有一个无参的构造方法。
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
//通过字节码对象,创建一个对象
Class<?> aClass = Class.forName("com.java.demo.clazz.Person");
Person person = (Person) aClass.newInstance();
}
方式二:用Constructor, 这个时候,空参的构造方法就是非必须的了。
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> aClass = Class.forName("com.java.demo.clazz.Person");
Constructor<?> constructor = aClass.getConstructor(String.class, String.class,String.class);
Person instance = (Person)constructor.newInstance("aa", "18", "USA");
}
方式二的增强版:当用的是getDeclaredConstructor()方法,setAccessible(true)之后,就算他的构造方法是private的也能创建对象(他能获取到所有的东西,包括公共的私有的)
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> aClass = Class.forName("com.java.demo.clazz.Person");
Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, String.class,String.class);
constructor.setAccessible(true); //暴力访问 IllegalAccessException
Person instance = (Person)constructor.newInstance("aa", "18", "USA");
}
获取Field(成员变量)
只要是Declared的,就能获取到所有声明的变量
public static void main(String[] args) {
Class<Person> personClass = Person.class;
Field[] fields = personClass.getFields(); //这种只能获取到公共的
for (Field f : fields) {
System.out.println(f);
}
Field[] declaredFields = personClass.getDeclaredFields(); //这种可以获取到所有的
for (Field f : declaredFields) {
System.out.println(f);
}
}
获取Method(类中的方法)
只要是Declared的,就能获取到所有声明的方法
public static void main(String[] args) {
Class<Person> personClass = Person.class;
Method[] declaredMethods = personClass.getDeclaredMethods();
for (Method method : declaredMethods){
System.out.println(method);
}
}
Method方法的调用
public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
Class<Person> personClass = Person.class;
Person person = personClass.newInstance();
Method spark = personClass.getDeclaredMethod("spark",String.class);
//执行方法,invoke, 两个参数
//第一个参数method属于那个对象,第二个对象方法参数
spark.setAccessible(true);
spark.invoke(person,"HeLLO GRIL");
}
反射学习总结 --为理解SpringMVC底层做准备的更多相关文章
- Servlet学习总结,为理解SpringMVC底层做准备
Servlet 一句话概括 :处理web浏览器,其他HTTP客户端与服务器上数据库或其他应用交互的中间层 Servlet 生命周期 : 1.类加载, 2.实例化并调用init()方法初始化该 Serv ...
- <转>ASP.NET学习笔记之理解MVC底层运行机制
ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- 深入源码分析SpringMVC底层原理(二)
原文链接:深入源码分析SpringMVC底层原理(二) 文章目录 深入分析SpringMVC请求处理过程 1. DispatcherServlet处理请求 1.1 寻找Handler 1.2 没有找到 ...
- iOS 反射 学习 和 运用
iOS 反射 学习 和 运用 反射: 通过 类名来获得生成的相应的类的实例 的这种机制 叫 反射 常用的反射方式 把 NSDictionary 转成 自定义 model 自定义 model 转 ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- 设计模式:与SpringMVC底层息息相关的适配器模式
目录 前言 适配器模式 1.定义 2.UML类图 3.实战例子 4.总结 SpringMVC底层的适配器模式 参考 前言 适配器模式是最为普遍的设计模式之一,它不仅广泛应用于代码开发,在日常生活里也很 ...
- SpringMVC--从理解SpringMVC执行流程到SSM框架整合
前言 SpringMVC框架是SSM框架中继Spring另一个重要的框架,那么什么是SpringMVC,如何用SpringMVC来整合SSM框架呢?下面让我们详细的了解一下. 注:在学习SpringM ...
- Java 反射学习笔记
要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...
随机推荐
- mysql5.7配置
my3306.cnf [client] port = 3306 #端口socket = /data/mysql3306/mysql3306.sock #mysql以socket方式运行的soc ...
- 利用system-config-kickstart实现半自动化安装
老司机开车了… 上车请坐稳… centos7系统 首先确认已经安装了system-config-kickstart包,如果没有安装就yum install system-config-kickstar ...
- 如何用纯 CSS 创作一个渐变色动画边框
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/odpRKX 可交互视频教 ...
- UART中RTS、CTS
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据. CTS (Clear ToSend,发送允许)为输入信号,用于 ...
- 【问题探索日志】python 函数优化
# 事情是这样的,我写的一个程序帧率上不去. 然后发现了一个疑似有问题的地方,如下 def around(x,y): around_dict = {(i,j) for i in range(-1,2) ...
- 洛谷 P1434 [SHOI2002]滑雪
这道题适合记忆化练手 毕竟总有些大佬虐题. 这个题有几个剪枝 1.记忆化 这个不用多说了吧 剪枝就是 如果 当前点到下面一个点的目前下降的高度+1 小于 下面那个点 能下降的高度 那么反过来,这个点不 ...
- 【数据传输 1】服务器—>客户端之间的数据类型转换
导读:在做项目的时候,在controller中,将List数据类型转换为了JSON字符串,那么,为什么要将其数据转换为JOSN呢?这样的转换是否是必须的,在这个转换过程中,又经过了那些步骤?注:本篇博 ...
- POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...
- 2016 Multi-University Training Contest 4 solutions BY FZU
1001 Another Meaning 对于这个问题,显然可以进行DP: 令dp[i]表示到i结尾的字符串可以表示的不同含义数,那么考虑两种转移: 末尾不替换含义:dp[i - 1] 末尾替换含义: ...
- Google SPDY
SPDY(读作“SPeeDY”)是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验.SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强 ...