一、概念
java程序运行时动态的创建类并调用类的方法和属性
 
二、原理简介
Class<?> clz = Class.forName("java.util.ArrayList");
ArrayList object = (ArrayList) clz.newInstance();
Method method = clz.getMethod("add",Object.class);
method.invoke(list , "sss");
 
上面就是我们最常见的反射的例子,前两行实现了类的装载、链接(验证、准备、解析)、初始化(newInstance其实也是通过反射调用类的<init>方法),后面两行实现了从class对象中获取对象然后执行反射调用。
 
设想,假如我们要实现Invoke方法,是不是只要实现如下类即可:
public class Method {

    public void invoke(Object obj , Object... args) {
ArrayList list = (ArrayList)obj;
list.add(args);
}
}
 
反射的原理之一:就是动态的生成类似于上述的字节码,加载到JVM中运行
 
获取Method对象流程
 
上面的Class对象是在加载类时由JVM构造的,JVM为每个类管理一个独一无二的CLASS对象,这份CLASS对象里维护着该类的所有
Method,Field,Constructor的cache,这份cache也可以称作为根对象。每次getMethod获取到的Method对象都持有对根对象的引用,因为一些重量级的Method的成员变量(主要是MethodAccessor),我们不希望每次创建Method对象都要重新初始化,于是所有代表同一个方法的Method对象都共享着根对象的MethodAccessor,每一次创建都会调用根对象的copy方法复制一份:
Method copy() {
Method res = new Method(clazz, name, parameterTypes, returnType,
exceptionTypes, modifiers, slot, signature,
annotations, parameterAnnotations, annotationDefault);
res.root = this;
res.methodAccessor = methodAccessor;
return res;
}
 
调用invoke方法流程
method.invoke方法会首先获取一个MethodAccessor,首先会从Method的根对象中获取MethodAccessor,如果为空,用reflectionFactory.newMethodAccessor返回DelegatingMethodAccessorImpl实例,然后将MethodAccessor赋值给Method的root对象中(因为MethodAccessor是所有Method共用的),然后调用DelegatingMethodAccessorImpl中的invoke方法,当调用invoke的次数大于15次以后,MethodAccessor将由java代码生成
 
整体流程图:

Java反射机制及原理的更多相关文章

  1. 初探Java反射机制

    反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序库.这项功能被大量地应用于JavaBeans中.反射机制提供了在运行状态中获得和调用修改任何一个类的属性和方法的能力. ...

  2. Java反射机制剖析(四)-深度剖析动态代理原理及总结

    动态代理类原理(示例代码参见java反射机制剖析(三)) a)  理解上面的动态代理示例流程 a)  理解上面的动态代理示例流程 b)  代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Pr ...

  3. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  4. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  5. java反射机制详解 及 Method.invoke解释

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  6. Java反射机制学习

    Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...

  7. Java反射机制(转载)

    原文链接:http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Jav ...

  8. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  9. Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...

随机推荐

  1. 【LeetCode】788. Rotated Digits 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  2. 1374 - Confusion in the Problemset

    1374 - Confusion in the Problemset    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory ...

  3. P1629八

    P1629八 Accepted 标签:[显示标签]     描述 八是个很有趣的数字啊.八=发,八八=爸爸,88=拜拜.当然最有趣的还是8用二进制表示是1000.怎么样,有趣吧.当然题目和这些都没有关 ...

  4. anaconda安装PIL

    PIL仅支持到python2.7: Pillow支持Python 3.x: conda install pillow 参考文献: 使用anaconda安装python3版本的PIL_不行不至-CSDN ...

  5. [opencv]approxDP多边形逼近获取四边形轮廓信息

    #include "opencv2/opencv.hpp" #include <iostream> #include <math.h> #include & ...

  6. C语言string操作

    创建方式 字符数组:空间已定 字符指针:未分配空间 初始化 字符数组: 创建与赋值必须在同一行 指定大小:未填满部分用'\0'填充 用字符串初始化:末尾自动添加'\0' 不初始化赋值则乱值 字符指针: ...

  7. Selenium_浏览器窗口大小(6)

    import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driv ...

  8. HttpRunner_参数化进阶

    一.获取返回包数据   在提取参数时,当 HTTP 的请求响应结果为 JSON 格式,则可以采用.运算符的方式,逐级往下获取到参数值:响应结果的整体内容引用方式为 content 或者 body,如上 ...

  9. div背景css样式笔记

    <style type="text/css"> .div1 { width: 1024px; height: 100%; margin: 0 auto; /*backg ...

  10. Go语言系列之time

    time包是go语言的内置库,提供了时间的显示和测量用的函数.日历的计算采用的是公历. 一.时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时 ...