java反射原理简单介绍(java反射机制的应用)

前面给大家介绍了一下什么是java反射机制,那么下面要给大家介绍的就是java反射机制的原理,那么它的原理究竟是怎样的呢?下面就通过下面来做一下详细的了解吧。首先我们再来介绍一下java反射机制。java反射机制就是java程序在运行的时候动态的创建类并调用类的方法以及属性。下面就来介绍一下原理。一、java反射机制原理下面是我们经常可以见到的反射例子:Class>clz=Class….

大家好,又见面了,我是你们的朋友全栈君。

前面给大家介绍了一下什么是java反射机制,那么下面要给大家介绍的就是java反射机制的原理,那么它的原理究竟是怎样的呢?下面就通过下面来做一下详细的了解吧。

首先我们再来介绍一下java反射机制。

java反射机制就是java程序在运行的时候动态的创建类并调用类的方法以及属性。

下面就来介绍一下原理。

一、java反射机制原理

下面是我们经常可以见到的反射例子:Class

> clz = Class.forName(“java.util.ArrayList”);

ArrayList object = (ArrayList) clz.newInstance();

Method method = clz.getMethod(“add”,Object.class);

method.invoke(list , “sss”);

来分析一下:

前面的2行实现了类的装载、链接、初始化。

后面的2行实现了从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的成员变量,大多数都不希望每次在创建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对象当中,之后调用DelegatingMethodAccessorImpl当中的invoke方法。

在调用invoke的次数大于15次之后,MethodAccessor将由java代码生成。

关于java反射机制原理就给你介绍到这里了,更多java反射机制常见问题,可以继续关注本站来了解。

推荐阅读:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128763.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)

    ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)摘自:https://blog.csdn.net/zouxu634866/article/details/106287879#comments_12978720ADRC自抗扰控制自学笔记(包含simulink仿真)总被蚊子叮的小旭2020-05-2217:59:361856收藏28分类专栏:控制版权ADRC控制中包含三个主要的部分:跟踪微分器,非线性状态反馈(非线性组合),扩张观测器。ADRC特点:继承了经典PID控制器的精华,对被控对…

    2022年5月19日
    83
  • Goland 2021.5 激活码【在线注册码/序列号/破解码】

    Goland 2021.5 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    60
  • matlab as(assert dominance)

    目录一.语法1.输入参数二.说明三.示例1.值在预期范围之内2.期望的数据类型3.预期的代码执行情况assert是条件为false时引发错误。一.语法assert(cond)assert(cond,msg)assert(cond,msg,A1,…,An)assert(cond,errID,msg)assert(cond,errID,msg,A1,…,An)1.输入参数cond-断言条件MATLAB表达式..

    2022年4月15日
    43
  • JVM 内存模型概述

    JVM 内存模型概述Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些数据区域都有各自的用途,以及创建和销毁的时间,并且它们可以分为两种类型:线程共享的方法区和堆,线程私有的虚拟机栈、本地方法栈和程序计数器。在此基础上,我们探讨了在虚拟机中对象的创建和对象的访问定位等问题,并分析了Java虚拟机规范中异常产生的情况。

    2022年6月12日
    34
  • Oracle Insert BLOB

    Oracle Insert BLOB来源于:http://arjudba.blogspot.com/2008/06/how-to-insert-blob-dataimage-video-into.htmlHowtoInsertBlobdata(image,video)intooracleBLOBsizeInthispostitisshownhowIcaninsertBlob

    2022年7月17日
    19
  • Linux抓包工具[通俗易懂]

    Linux抓包工具[通俗易懂]字符界面的的抓包工具—-tcpdump可用选项-A以ASCII格式打印出所有分组,并将链路层的头最小化。-c在收到指定的数量的分组后,tcpdump就会停止。-C在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数file_size的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。-d将匹配信息包的代码以人们能够理解的汇编格式给出。-dd将

    2022年10月14日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号