反射学习总结 --为理解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 ...
随机推荐
- sin_addr.s_addr和sin_addr.S_un.S_addr
sin_addr.s_addr和sin_addr.S_un.S_addr 先mark一下,等下写
- 在Windows上安装和配置Jenkins
一.windows上安装Jenkins 1.官网下载Jenkins安装包Jenkins.msi ,进入安装模式,选择默认配置,安装完成之后,就会默认打开浏览器 http://localhost:808 ...
- .NET中的缓存实现
软件开发中最常用的模式之一是缓存,这是一个简单但非常有效的概念,想法是重用操作结果,执行繁重的操作时,我们会将结果保存在缓存容器中,下次我们需要该结果时,我们将从缓存容器中取出它,而不是再次执行繁重的 ...
- 【06】Firebug记录Javascript日志
Firebug记录Javascript日志 你可以使用Firebug来生成日志. 这有助于我们调试web页面并发现页面的错误. 在Firefox浏览器中执行以下代码: <!DOCTYPE HTM ...
- 【转】玩玩负载均衡---在window与linux下配置nginx
最近有些时间,开始接触负载均衡方面的东西,从硬件F5再到Citrix Netscalar.不过因为硬件的配置虽然不复杂,但昂贵的价格也让一般用户望而却步(十几万到几十万),所以只能转向nginx,sq ...
- Laya 类列表加载优化
Laya 类列表加载优化 @author ixenos 类列表:在一个页面展示的大量的零散单元的集合(聊天面板.背包) 一.按展示优化1.展示内容少,即使大量数据,但用户只看到少量信息的时候,考虑按需 ...
- Android渲染器Shader:环状放射渐变渲染器RadialGradient(三)
Android渲染器Shader:环状放射渐变渲染器RadialGradient(三) Android RadialGradient渲染器提供一种环状.发散.放射形状的渐变渲染器. 写一个例子: ...
- 什么是Kubernetes?
刚刚进学校实验室,第一次开会导师和小组同学说了n次Kubernetes,从来没听过,一脸懵逼. Kubernetes也有很多人把它叫K8S, 原文链接:http://omerio.com/2015/1 ...
- POJ 1985 Cow Marathon【树的直径】
题目大意:给你一棵树,要你求树的直径的长度 思路:随便找个点bfs出最长的点,那个点一定是一条直径的起点,再从那个点BFS出最长点即可 以下研究了半天才敢交,1.这题的输入格式遵照poj1984,其实 ...
- hdu 1711kmp裸题
#include<stdio.h> #define N 1000050 int text[N],t[N],next[N],n,m; void getnext() { int j=0,k=- ...