Java基础知识——类装载器与反射机制
类装载器ClassLoader
类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。
类装载器把一个类装入JVM中,要经过三步:
1.装载:查找和导入Class文件;
2.链接:执行校验、准备和解析(解析是可以选择的);
3.初始化:对类的静态变量、静态代码块执行初始化工作;
类装载工作由ClassLoader及其子类负责。JVM在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。
根装载器不是ClassLoader的子类,它使用C++编写,因此,我们在JAVA中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。
ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中,ExtClassLoader负责装载JRE扩展目录ext中的类包,AppClassLoader负责装载Classpath路径下的类包。
这三个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。
publicclass ClassLoaderTest { publicstaticvoid main(String[] args) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); System.out.println("current loader---"+loader); System.out.println("parent loader---"+loader.getParent()); System.out.println("grandparent loader---"+loader.getParent().getParent()); } } |
上面代码运行结果:
current loader---sun.misc.Launcher$AppClassLoader@20cf2c80 parent loader---sun.misc.Launcher$ExtClassLoader@1729854 grandparent loader---null |
由于根加载器在java中访问不到,所以返回null。
每一个类在JVM中都拥有一个对应的java.lang.Class对象,它提供了类结构信息的描述。Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的。
Java反射机制
Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.lang.reflect包中。主要的反射类有Constructor、Method、Field、ClassLoader等。
publicclass PrivateCar { private String color; protectedvoid drive(){ System.out.println("Drive private car! The color is :"+color); } } publicclass PrivateCarReflect { publicstaticvoid main(String[] args) throws Throwable { //通过类装载器获得PrivateCar类对象 ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class clazz = loader.loadClass("com.quietboy.reflect.PrivateCar"); //得到实例 PrivateCar pcar = (PrivateCar)clazz.newInstance(); //访问属性,并设置属性 Field color = clazz.getDeclaredField("color"); color.setAccessible(true);//取消Java语言访问检查,以访问private变量 color.set(pcar, "红色"); //访问方法,并调用方法 Method drive = clazz.getDeclaredMethod("drive", null); drive.setAccessible(true);//取消Java语言访问检查,以访问protected方法 drive.invoke(pcar, null); } } |
只要JVM的安全机制允许,反射机制可以绕过限制,访问私有变量、调用私有方法。
转载于:https://blog.51cto.com/quietboy/1429347
Java基础知识——类装载器与反射机制相关推荐
- java 反射类 spring_学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 学习Spring必学的Java基础知识----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- java基础知识之注解、反射(一)
前言 此博客为供个人学习总结备用,如有错误请指正. 正文 Annotation(注解) java自带的注解包含以下三个: 1.@Override 注解表示重写父类的方法 2.@Deprecated 声 ...
- Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...
- 学习Spring必学的Java基础知识
学习Spring必学的Java基础知识(1)----反射 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Jav ...
- 【转】Java基础知识整理
本博文内容参考相关博客以及<Java编程思想>整理而成,如有侵权,请联系博主. 转载请注明出处:http://www.cnblogs.com/BYRans/ PDF版下载链接:<Ja ...
- java 基础知识总结
Java基础知识总结 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思 ...
- Java 基础知识总结(下)-王者笔记《收藏版》
上一篇 Java基础知识学习总结之(上) 下一篇 Java 集合容器篇面试题 (上) java毕业设计项目<100套>推荐 毕设/私活/大佬必备,一个挣钱的开源前后端分离脚手架 2W字梳 ...
- 【转】java基础知识总结
Java基础知识总结 本博文内容参考相关博客以及<Java编程思想>整理而成,如有侵权,请联系博主. 转载请注明出处:http://www.cnblogs.com/BYRans/ PDF版 ...
最新文章
- c# out ref
- python切片操作例题_Python之切片操作
- 带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩
- java信用分秒杀系统设计思路,秒杀系统设计思路
- body onload 控制窗口大小 html,HTML5 对各个标签的定义与规定:body的介绍
- javafx中css选择器_JavaFX技巧12:在CSS中定义图标
- java web服务_将Java服务公开为Web服务
- VMware虚拟机的三种联网方法及原理
- 安卓系统分屏相关修改思路
- 小程序入门到精通(二):了解小程序开发4个重要文件
- 你百分之九十九的问题都是因为懒
- 微课|玩转Python轻松过二级(1.1节):Python命令式编程与函数式编程模式
- k8s核心技术-Service概述_Service的三种类型_ClusterIP只能内部访问_NodePort可以外网访问_LoadBalancer公有云---K8S_Google工作笔记0032
- 福建首个区块链赋能教育信息化项目上线
- table内容超出宽度时隐藏并显示省略标记
- R与Python或协同助力机器学习:听Azure ML Studio讲座有感
- 【Spring-tx】AutoProxyRegistrar类
- ESP8266 WIFI 模块连接OneNet测试
- 程序员的自我修养 -- 读书笔记
- 开机动画适配方案_修改开机动画教程
热门文章
- 打造无所不及的智能:徐直军发布华为AI战略及全栈全场景方案
- 语义分割领域开山之作:Google提出用神经网络搜索实现语义分割
- 泡沫破裂之后,强化学习路在何方?
- 芯片业又起波澜!博通189亿美元收购遭质疑,股价一度跌近19%
- 自动驾驶出租车可行性研究报告:2020年能成真吗?
- 7 年“键盘手”没在意!某程序员手疼查出骨肿瘤,已让骨头成了“豆腐渣”
- 世界上第一台电子计算机到底是谁发明的?
- 初级程序员常犯错误一览
- ​“好师父”如何破解大学生就业难题
- 写 5 个你知道的 HTML5 标签,说明他们的意义