反射是什么?

  通俗理解 - 照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底层做准备的更多相关文章

  1. Servlet学习总结,为理解SpringMVC底层做准备

    Servlet 一句话概括 :处理web浏览器,其他HTTP客户端与服务器上数据库或其他应用交互的中间层 Servlet 生命周期 : 1.类加载, 2.实例化并调用init()方法初始化该 Serv ...

  2. <转>ASP.NET学习笔记之理解MVC底层运行机制

    ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET ...

  3. 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 ...

  4. 深入源码分析SpringMVC底层原理(二)

    原文链接:深入源码分析SpringMVC底层原理(二) 文章目录 深入分析SpringMVC请求处理过程 1. DispatcherServlet处理请求 1.1 寻找Handler 1.2 没有找到 ...

  5. iOS 反射 学习 和 运用

    iOS  反射 学习 和 运用 反射:  通过 类名来获得生成的相应的类的实例 的这种机制  叫 反射 常用的反射方式 把 NSDictionary  转成 自定义 model 自定义 model 转 ...

  6. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  7. 设计模式:与SpringMVC底层息息相关的适配器模式

    目录 前言 适配器模式 1.定义 2.UML类图 3.实战例子 4.总结 SpringMVC底层的适配器模式 参考 前言 适配器模式是最为普遍的设计模式之一,它不仅广泛应用于代码开发,在日常生活里也很 ...

  8. SpringMVC--从理解SpringMVC执行流程到SSM框架整合

    前言 SpringMVC框架是SSM框架中继Spring另一个重要的框架,那么什么是SpringMVC,如何用SpringMVC来整合SSM框架呢?下面让我们详细的了解一下. 注:在学习SpringM ...

  9. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

随机推荐

  1. bzoj2402 陶陶的难题II

    这个是题目描述: 题解: 啊啊啊啊啊…… 垃圾分数规划. 垃圾树链剖分. 垃圾斜率优化. 垃圾darkbzoj. 这里才是题解: 我们设那个分数的值=k,那么有 $(yi-k*xi)+(qj-k*pj ...

  2. MySQL本地登录及数据库导入导出

    注意:本地MySQL服务要开启 更新整个数据库 1.将正式服务器上的数据库做备份 登录到正式服务器,执行如下命令:(注意空格) mysqldump -uroot –p密码 数据库名 -P 接口 --d ...

  3. WCF未找到终结点

    配置都配了,仍然找不到,config文件没有重新加载,原因不详,只能重新编译一下,就好了....后续找找原因看看

  4. CSRF verification failed. Request aborted. 表单提交方法为POST时的报错

    本人所用Django版本为1.11,在设置请求方法为POST时,遇到标题中的错误,尝试了多种方法,最终通过下面的操作来修复: 在template文件中添加图中红框部分 接着,导入csrf_exempt ...

  5. Android开发——遍历读写U盘、SD卡等外部存储

    1.首先需要得到挂载在手机上的有哪些盘符 String[] result = null; StorageManager storageManager = (StorageManager)getSyst ...

  6. 一个python爬虫协程的写法(gevent模块)

    from bs4 import BeautifulSoup import requests import gevent from gevent import monkey, pool monkey.p ...

  7. 2016 Multi-University Training Contest 8 solutions BY 学军中学

    1001: 假设有4个红球,初始时从左到右标为1,2,3,4.那么肯定存在一种方案,使得最后结束时红球的顺序没有改变,也是1,2,3,4. 那么就可以把同色球都写成若干个不同色球了.所以现在共有n个颜 ...

  8. 【BZOJ4517】排列计数(排列组合)

    题意:1-n的一个序列,其中有m个a[i]=i,求方案数 n,m<=1000000 题意:显然ANS=c(n,m)*d[n-m] d[i]为错排方案数=d[i-1]*n+(-1)^n ; ..] ...

  9. linux下部署一个JavaEE项目的简单步骤

    部署项目的前提是准备好环境,包括:Java运行环境(JDK),Tomcat,Mysql数据库 1.首先将东西上传到服务器,我是在windows安装ssh工具(下载安装git即可http://gitfo ...

  10. linux awk常用命令【转载】

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...