java深入理解反射机制

java类装载器

工作机制:

1:装载:查找和导入class文件
2:链接:执行校验(检查载入class文件的正确性),准备(给类静态变量分配存储空间)和解析(将符号引用变成直接引用)步骤
3:初始化:对类的静态变量、静态代码块执行初始化工作。

类装载工作主要是由类classLoder,及其子类来负责的。
classloder是一个java运行的主键
jvm在运行时会产生3个classloder
1:根装载器
2:扩展类装载器extclassloder
3:系统类装载器appclassloder

根装载器不是classloder的子类,是用c++编写的所以我们在java看不到它。
跟装载器用来负责装载jre的核心类库,如jre目标下的rt.jar等

extclassloder,appclassloder都是classloder的子类
extclassloder负责装载jre的括展目录exe中的jar类包
appclassloder负责装载classpath路径下的类包

这三个类装载器有父子关系
根装载器是appclassloder的父装载器是extclassloder的祖父装载器

从当前线程中获取classloder这个对象。

classLoder loader = Thread.currentTread().getContextClassLoader();
System.out.println("current loader:"+loader)当前appclassloader
System.out.println("parent loader:"+loader)当前extclassloader
System.out.println("grandparent loader:"+loader)当前装载器

因为在java中无法获得根装载器的句柄所以直接返回null
jvm装载类时使用全盘服从委托机制
全盘服从是指当一个classloder装载一个类的时候除非显示的使用另一个classloder该类则依赖基也用的类由这个classloder来载入。
而委托机制是指先委托父装载器寻找目标类只有在找不到的情况下才从自己的类路径中查找并装载目标类。
这个是从一个安全的角度来考虑的。让所有的装载器是由根装载器来装载的。避免装入一个不安全的类。

类装载器的重要方法。

1:class loadClass(String name)

name是装载类的名字,必须要使用全限量类名。不是所有的类都要解析。
2:class defineClass(String name,byte[] b,int off,int len)

将类文件的字节数组转换成java虚拟机中的java.lang.class对象,字节数组可以从本地文件系统远程网络来进行获取,而name为字节数组对应的全限定类名。
3:class findSystemClass(String name) 

从本地文件系统来载入class文件如果本地文件系统不存在该class文件那么将会抛出classnotfoundException这个异常,这个方法是jvm默认使用的机制
4:class findLoadedClass(String name)

调用该方法是来查看该classLoder是否已经装入到某个类当中,如果已经装入则返回java.lang.class对象,否则返回null值,如果强行装载已经存在的类,那么将会抛出链接错误
5:classLoder getParent()

获取该装载器的夫装载器,除根装载器之外,所有的类装载器有且只有一个父装载器。

class反射对象描述类语义结构,可以从Class对象中获取构造函数,成员变量,方法等类元素的反射对象,并以编程的方式通过这些反射对象对目标,对象进行操作这些反射对象类在java.reflect包中定义,下面是最主要的三个反射类。 

1:Constructor

Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。

Constructor 允许在将实参与带有底层构造方法的形参的 newInstance() 匹配时进行扩展转换,但是如果发生收缩转换,则抛出IllegalArgumentException。

2:method

Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。

Method 允许在匹配要调用的实参与底层方法的形参时进行扩展转换;但如果要进行收缩转换,则会抛出 IllegalArgumentException。
  1:class getRrturnType()
  2:class[] getParameterTypes()
  3: class[] getExceptionTypes()
  4: Annotaion [][] getParameterAnnotations():

3:File

Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

Array 允许在执行 get 或 set 访问操作期间进行扩展转换,但如果将发生收缩转换,则抛出一个 IllegalArgumentException。

java反射机制 与ioc的关系

  在spring中,通过ioc可以将实现类、参数信息等配置在其对应的配置文件中,那么当需要更改实现类或参数信息时,只需要修改配置文件即可,
我们还可以对某对象所需要的其它对象进行注入,这种注入都是在配置文件中做的。

  Spring的ioc的实现原理利用的就是java的反射机制,Spring的工厂类会帮我们完成配置文件的读取、利用反射机制注入对象等工作,我们可以通过
bean的名称获取对应的对象。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值