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  [email protected]

parent  [email protected]

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的安全机制允许,反射机制可以绕过限制,访问私有变量、调用私有方法。

Java基础知识——类装载器与反射机制,布布扣,bubuko.com

时间: 2024-10-12 22:23:10

Java基础知识——类装载器与反射机制的相关文章

java基础之--反射机制

反射的概念: 反射是指程序可以访问.检测和修改它本身的状态和形为的一种能力,并根据自身形为的状态和结果,调整和修改程序所描述的形为的状态和相关语义.                反射是java中一强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以在运行时装配,无须在组件之间进行源码链接.但反射使用不当会使成本很高. 反射的作用: 反编译:.class-->.java 通过反射机制访问java对象的属性,方法,构造方法等: sun为我们提供的反射机制的类: java.lang.Class

JAVA基础知识之JVM-——使用反射生成并操作对象

Class对象可以获取类里的方法,由Method对象表示,调用Method的invoke可以执行对应的方法:可以获取构造器,由Constructor对象表示,调用Constructor对象的newInstance方法可以执行类对应的构造方法:可以获取成员变量,由Field对象表示,通过Field对象可以直接修改类的成员变量的访问权限和值. 创建对象 通过反射有两种方式创建对象 使用Class对象的newInstance(),这是最常用的方式,根据配置文件信息创建对象. 使用Class对象获取指定

学习Spring必学的Java基础知识(1)----反射

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

学习Spring必学的Java基础知识(1)----反射(转)

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中. wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中.wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方

学习Spring必学的Java基础知识(7)----事务基础知识

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

学习Spring必学的Java基础知识(2)----动态代理

学习Spring必学的Java基础知识(2)----动态代理 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www

主题:学习Spring必学的Java基础知识(8)----国际化信息

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.):[1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081[2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/112329