反射是什么?

  通俗理解 - 照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. MySQL sys Schema

    MySQL sys Schema 使用sys Schema的先决条件 使用sys Schema sys Schema Progress Reporting sys Schema Object Refe ...

  2. 2019年,Python工程师必考的6个面试题,Python面试题No5

    第1题:Python里面如何实现tuple和list的转换? 函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tuple, 元素不变,排序也不变 list转为tuple: ...

  3. python接口自动化-有token的接口项目使用unittest框架设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  4. Java.lang.NoSuchMethodError: 后带 V/Z等字母的

    知道 Java.lang.NoSuchMethodError: 后带 V/Z等字母的 错误,一般都是 jar包冲突引起的,找到冲突的jar包,去掉一个就好

  5. Android ShapeDrawable之OvalShape、RectShape、PaintDrawable、ArcShape

     Android ShapeDrawable之OvalShape.RectShape.PaintDrawable.ArcShape Android图形图像基础之OvalShape.RectShap ...

  6. BZOJ 1022: [SHOI2008]小约翰的游戏John【anti-SG】

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...

  7. hdu 1711kmp裸题

    #include<stdio.h> #define N 1000050 int text[N],t[N],next[N],n,m; void getnext() { int j=0,k=- ...

  8. springboot注释详解

    1.属性注入 @ConfigurationProperties(prefix="...") spring会从classpath下的/config目录或者classpath的根目录查 ...

  9. mac上storm standalone安装

    一.安装storm 下载storm http://storm.apache.org/downloads.html export STORM_HOME=/Users/huangjiahong/Docum ...

  10. webstorm初始化

    1.皮肤设置,重启后Terminal皮肤生效 2.排除目录 2.1全局排除 2.2局部排除 选中文件夹 右击Make Directroy As 选择 Excluded 3.代码自定义 3.1 cons ...