JAVA基础 (二)反射 深入解析反射机制
在谈论到反射这个问题时,你是否有例如以下疑问?
不管是在.NET还是Java中反射的原理和机制是一样的,理解了一种还有一种就能够迎刃而解,想要理解反射首先须要了解底层的一些概念和执行。理解了反射有助于你理解程序的执行原理,眼下非常多框架(java、.NET)中都引入了反射这一个技术,反射事实上也不是什么新的技术仅仅是几个不同的操作过程集成到一起关联起来了。
从表面上我们看到的效果是这种:通过传入一个字符串能够得到某个类的对象,在这一个过程中做了非常多事情。你是否有以下的一些疑问存在?
JDK、JRE是一回事吗?
JRE和JVM有联系吗?
JVM和类载入器什么关系?
类载入器载入类的过程?
反射和类载入之间有什么神奇关系?
看完这篇文章,或许你会对反射有一个清晰的认识。
JDK是为我们开发提供的一个开发类库,里面存在着大量的开发类,而JRE是开发好的程序执行的环境。也就是说你的电脑上假设想执行java程序能够没有JDK,但要有JRE这个执行环境,往往下载了JDK开发包已经包括了JRE这个环境。安装时是能够选择不安装JRE的,你开发好的程序都须要測试、执行等。因此有必要安装JRE。
而JVM是存在JRE这个环境里的,仅仅是在JRE这个环境里面不止仅有JVM。JVM是必须的。假设没有其他的类辅助JVM执行,JVM是没有办法执行的。举个简单的样例来看看好想红花或许绿叶来衬托、假设没有绿叶的衬托怎么会显示出红花的价值呢。
类载入器这些类是JVM提供的,负责把类(.class文件)读入到内存中,而且为每一个载入到内存中的类创建一个Class对象。你能够理解为一般我们看到的类都有一个超类Class,当一个类载入时就会为这个类实例化一个Class对象,这个对象负责唯一标示该类,事实表明这个Class对象很实用,如论是反射还是注解等的实现都依赖于这一对象,我们通过这个Class对象里面的方法能够获取到不论什么一个类的全部方法(包含父类集成来的)、全部字段(包含私有属性)、构造器等等,在上一篇注解博客中核心就是利用了Class对象的getMethods()方法,得到一个类的全部方法,然后循环推断注解才实现对注解方法起作用。
获得Class对象的三种方式
1.Class类的forName(String clazzName)
2.调用某个类的class属性,如Person.class
3.某个对象的getClass()方法
类载入的步骤(想了解的更细节能够看一下JVM规范)
1.载入
指的是将.class文件读入内容。并为之创建一个Class对象;能够理解为全部的类也是实例,它们都是java.lang.Class这个类的实例。
载入类的途径
A:从本地文件系统中载入.class文件
B:从JAR包中载入.class文件。比如你连接mysql或oracle数据库时。是不是有一个驱动jar包。驱动类都放在这个jar中。再多说一点:关于驱动jar文件,一个驱动能够连接哪个数据库或者支持啥功能,本地事务还是全局事务,主要看驱动里面支持不支持。
C:网络载入
D。java文件先编译,再载入
2.连接
将内容中的.class二进制文件读入到JRE代表的进程内容中。又分为验证、准备、解析三个过程。
3.初始化
主要是对一些静态字段赋值操作。初始化时可能并没有类的实例呢,所以是仅仅初始化类范围的变量。如static修饰的变量。
初始化不不过对目标类初始化,假设它有继承的父类。它的父类会都初始化。我们知道全部类都是object的子类,object每次都会被初始化,这也解析了为什么你能够调用Object这个类的方法,因此它也初始化了。
类载入器
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlsb25nc2hlbmcxMTI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
从上图中我们能够得知哪些类载入器以及它们主要负责载入哪些类,当中MyClassLoader1/2是自己定义类载入器,能够从指定文件夹载入类。即.java文件不再classpath路径下也能够载入,有时我们会遇到找不到类的问题,事实上就是类路径写的不错。
类载入器载入类算法?
内存管理、CUP调度等都有自己的算法,比方先进先出、最早使用原则,写算法的目的是实现资源合理调配。从各种方案中找到一种能够解决实际问题的思路,类再载入类时也存在这种问题,如遇到一个.class类后,让哪一个载入器载入?去哪里找载入的类?等等,电脑是非常傻的,不要把电脑想的非常聪明。不要让电脑去做选择,它的选择是我们给它指定的。
算法
依赖原则:当一个类载入时。它所依赖的类同一时候被载入。
尊老爱幼::针对载入器,每次载入类都让着长辈。父载入器优先。
缓存:全部载入好的类放入一个缓存中,载入某个类时先去缓存中查找,不存在的话才去载入(假设你改动了一个载入好的类,也是存在的不去又一次载入),这也是为什么每次我们改动了一个类后,须要又一次启动tomcat即重新启动JVM。
上面这些是实现反射的基础,总结就两点一是Class对象;而是类载入器。反射主要是依赖于java的这两个特性实现的反射过程,下篇中将用一个实例来实现反射。通过从属性文件或者配置文件里读取类的字符串信息来实例化类,Spring框架也是利用的这一个过程实现依赖注入的。
对于底层的一些东西觉的还是有必要理解、并能够使用。各种框架都依赖于底层。这对学习框架也是非常有帮助的。
JAVA基础 (二)反射 深入解析反射机制的更多相关文章
- Java基础-处理json字符串解析案例
Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...
- Java面试题总结之Java基础(二)
Java面试题总结之Java基础(二) 1.写clone()方法时,通常都有一行代码,是什么? 答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有G ...
- Java入土--Java基础(二)
Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...
- [Think In Java]基础拾遗2 - 多态、反射、异常、字符串
目录 第八章 多态第十四章 类型信息第十二章 通过异常处理错误第十三章 字符串 第八章 多态 1. 前期绑定 & 后期绑定 绑定是指将方法调用同一个方法主体关联起来的这么一个过程.如果在程序执 ...
- java基础之轻松搞定反射
前言 java的名词太古怪.反射白话文解释,就是把一个字符串的类名,实例化,少了个new单词. 反射步骤 准备一个苹果类像这个样子. public class PingGuo { private St ...
- [ 转载 ] Java基础二
前言 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应该说被面试到的几率很大.这里整理挑选出来供大家面试前拿来看一看,所有题目整理自网络,有一 ...
- Java基础系列-Enum深入解析
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755129.html 一.概述 枚举就是一个语法糖效果. 定义一个枚举,其实就是定义一个继承抽象类E ...
- java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- android基础篇------------java基础(11)(文件解析xml and Json )
一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...
随机推荐
- PostgreSql入门命令
1 命令行登录数据库 有两种方式,一是直接在系统shell下执行psql命令:而是先进入psql环境,然后再连接数据库.下面分别给出实例: (1)直接登录 执行命令:psql -h 192.168.1 ...
- zk 节点故障 重连机制
<pre name="code" class="html">如果在连接时候zk服务器宕机 To create a client session th ...
- 百度静态资源(JS)公共库
例如: chosen http://apps.bdimg.com/libs/chosen/1.1.0/chosen.jquery.min.js classlist http://apps ...
- Python学习笔记7-把函数当参数传递、指定可变参数
把函数当参数传递 # 函数参数传递 # 面向对象编程就是把对象传来传去 # 面向函数编程就是把函数传来传去 def mytest(num): return num * 2 # # 不光可以传递变量,还 ...
- java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**
原文出处:http://cmsblogs.com/?p=1412 在上篇博文(java中文乱码解决之道(一)—–认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述 ...
- Android 仿微信滑动删除
做这个功能主要是项目需要:找了很多资料但是效果都不理想,后来就自己研究写了一个,拿出来共享给大家,贴上代码大家慢慢看看,还是比较容易懂的. 主要代码: package com.zbq.widget; ...
- git 删除远程主分支及其它操作
1. 删除远程分支 如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放稳定代码的地方),可以用这个非常无厘头的语法来删除它:git push [远程 ...
- vb.net常用函数
当然,这些都可以从MSDN查到,但是有时候打开帮助老慢的,所以先放到这里放一放,查个函数什么的比较快一点.都是从网上搜来的.Abs(number) 取得数值的绝对值. Asc(String) 取得字符 ...
- JAVA设计原则
1.单一职责规则(SRP):有且仅有一个原因引起类的变化. 2.依赖倒置规则(DIP): 高层模块不应该依赖底层模块,两者都用依赖接口: 接口不依赖细节: 细节依赖接口. 3.接口隔离规则:类间的 ...
- 加密传输SSL协议5_Hash Function
怎么对一个大的文件进行签名,因为文件比较大,非对称签名很慢.那么想,我能把这个大的文件通过一种函数变换,变成一个和源文件唯一对应的的小的文件吗?答案是可以的. Hash Function 这里任何的文 ...