Java反射机制

    在了解Java反射机制之前,咱们先来了解下JVM的运作流程:

  通过javac命令编译后JVM启动,你的代码会编译成一个.class文件,然后被类加载器加载进JVM的内存中,你的类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。JVM创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Object()。



    因此,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    Reflection API 反射取得任何类的内部信息,并且能直接操作任意对象的内部属性及方法。

Java反射机制提供的功能

Ø运行时判断任意一个对象所属的
Ø运行时构造任意一个类的对象
Ø运行时判断任意一个类所具有的成员变量和方法
Ø运行时调用任意一个对象的成员变量和方法
Ø生成动态代理

那如何获取一个对象所属的类,或者是类的所有成员变量和方法呢。Java的反射机制可以轻松的办到,因为每一个类都有一个对应的class类,通过该类获取对象的

Java反射API


反射API用来生成JVM中的类、接口或则对象的信息。
- Class类:反射的核心类,可以获取类的属性,方法等信息。
- Field类:Java.lang.reflec包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
- Method类: Java.lang.reflec包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
- Constructor类: Java.lang.reflec包中的类,表示类的构造方法。


1)Bootstrap ClassLoader启动类加载器

负责加载$JAVA_HOME中jre/lib/里所有的 class(JDK 代表 JDK 的安装目录,下同),或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如 rt.jar,所有的java.*开头的类均被 Bootstrap ClassLoader 加载)。启动类加载器由 C++ 实现,不是 ClassLoader 子类。无法被 Java 程序直接引用的。

2)Extension ClassLoader扩展类加载器

该加载器由sun.misc.LauncherExtClassLoaderJavajar

JAVA_HOME中jre/lib/.jar或-Djava.ext.dirs指定目录下的 jar 包。即JDK\jre\lib\ext目录中,或者由 java.ext.dirs 系统变量指定的路径中的所有类库(如javax.开头的类),开发者可以直接使用扩展类加载器

3)App ClassLoader应用程序类加载器

该类加载器由 sun.misc.Launcher$AppClassLoader 来实现,负责记载 classpath 中指定的 jar 包及目录中 class,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

启动类加载器:它使用 C++ 实现(这里仅限于 Hotspot,也就是 JDK1.5 之后默认的虚拟机,有很多其他的虚拟机是用 Java 语言实现的),是虚拟机自身的一部分。
所有其他的类加载器:这些类加载器都由 Java 语言实现,独立于虚拟机之外,并且全部继承自抽象类 java.lang.ClassLoader,这些类加载器需要由启动类加载器加载到内存中之后才能去加载其他的类。
应用程序都是由这三种类加载器互相配合进行加载的,我们还可以加入自定义的类加载器。


获取Class对象的三种方式

第一种通过getClass()方法来获取Class对象;

    前提:已知某个类的实例,调用该实例的getClass()方法Class对象

       实例:Class clazz =“www.atguigu.com”.getClass();


第二种任何数据类型(包括基本数据类型)都有一个“静态”的class属性,因此可以通过这个进行获取;

    前提:若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高

       实例Class clazz = String.class;


第三种通过Class类的静态方法:forName(String  className)【常用】通过包名类名进行获取;

     前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException

       实例:Classclazz= Class.forName(“java.lang.String”);

第四种通过类加载器来进行加载(其他方式,不做要求);

       ClassLoader cl =this.getClass().getClassLoader();

       Classclazz4 = cl.loadClass(“类的全类名”);




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜马拉雅以南

奶茶,干杯?!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值