`

java的反射和它的类加载机制

阅读更多

1. java 的类装载系统:

在java虚拟机中有两种类装载器: 启动类装载器 和 自定义类装载器。 前者是jvm的一部分,后者是java程序的一部分。不同的类装载器放在不懂得命名空间中。

类转载子系统涉及java的其它几个部分,及来自lang库的类。比如自定义的类装载器必须派生自java.lang.ClassLoader。 ClassLoader中定义的方法为程序提供了访问类装载器机制的接口。

 

其实在java内置的类装载器有三种。

1Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。

2Extension ClassLoader 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类

3AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。

工作流程 装载:查找并装载类型的二进制数据。

        链接: 验证 准备 解析

        初始化 : 把类变量初始化为正确的初始值。

类的ClassLoader 的 protected final Class findSystemClass(String name);接受一个字符串作为参数,

2. 反射射就是一面镜子   能够在镜子中看到 这个类中的“所有”的东西

有三种可以在程序中得到class对象的方式:
第一中就是 在编译时不知道其类名但在运行期可以得到该类名  使用class类的forname()静态方法获得class对象  如: class c=class.forname("得到的类名的全名  包括属于的工程,包");
第二中就是当我们得到该类的一个对象我们就可以直接用该对象的getclass();方法得到给类的class对象如:
   class c=对象名.getclass();
第三种就是我们在运行 前就已经知道其类名的  可以直接使用类名.class来得到一个给类的class对象
如:  class c = 类名.class;

3. 反射装载过程: 

除了系统类,扩展库和classpath的自定义的装载,java还支持动态扩展,包括运行时决定使用的类型,装载,使用它们。通过反射的java.lang.Class 的forName()方法,或者用户自定义的loadClass()方法,都可以自动扩展java程序。

    对于Class。forName() 来讲主要有两种形式:

 

static Class<?> forName(String className)
Returns the Class object associated with the class or interface with the given string name.
static Class<?> forName(String name, boolean initialize, ClassLoader loader)
Returns the Class object associated with the class or interface with the given string name, using the given class loader.

三参数的解释 如果initalize设为true,类型会在forName()方法返回前连接并初始化;如果是false,类型会被加载,可能会连接但是不会被明确的初始化。如果loader 为null则使用默认的加载器,也可以选用自定义的加载器。

两个forName()方法都返回Class实例的引用,代表被装载的类型。如果不能装载抛出ClassNotFoundException。即前提是类已经编译成class的字节码文件。

 

如果使用用户自定义的装载器,那么loadClass()方法就要调用 

 

Class<?> loadClass(String name)
Loads the class with the specified   binary name .
protected Class<?> loadClass(String name, boolean resolve)
Loads the class with the specified   binary name .

这两个方法来装载新的请求的类型,如果找不到,会抛出ClassNotFoundException 异常。 



类装载的反向查找是去已经加载的类库中寻找权限定名的过程,如果没有就重新动态扩展,(就像一个map的映射方式去找的。)前提是类已经编译成class的字节码文件。

 

分享到:
评论

相关推荐

    类加载机制及反射

    类加载机制及反射 类加载机制及反射

    Java类加载机制与反射-PPT

    Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射

    反射机制和类加载机制学习总结

    反射机制和类加载机制学习总结 Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并...

    java注解_反射_字节码_类加载机制.zip

    java 注解 反射 字节码 类加载 包括pdf资料以及全部源码文件,具有非常大参考价值和学习意义

    java类加载器和反射学习要点ppt

    本学习讲义是关于java类加载和反射机制需要注意的要点学习,内容详细

    JAVA反射机制与类的加载

    JAVA反射机制与类的加载,详细的说明java反射机制的实例以及应用是入门级的课件

    Java反射机制——类的加载方法,创建对象,获取方法以及结构

    一、java反射机制概述 Reflection (反射)被视为动态语言的关键,为什么这么说呢,是因为它在运行时就确定下来了。反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的...

    JAVA反射机制详解视频

    (类的加载概述和加载时机) (类加载器的概述和分类) (获取class文件对象的三种方式) (通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并...

    Java反射机制知识

    里面主要是介绍Java反射的只是,包括介绍Class类的初始化,如何通过反射动态加载类和获取类的信息等。

    java加载类与反射机制

    Java 程序在运行期间可以动态加载、解析和使用一些在编译阶段并不确定的类型数据,这一机制被称为反射(Reflection)。反射库(reflection library)提供了一个非常丰富且精心设计的工具类,以便编写能够动态操纵Java...

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    3.2.1 Java反射机制的概念 Java反射机制在Java运行状态中,对于任意一个类,我们都能够知道这个类的所有属性和方法;, 对于任意一个对象,我们都能够调用它的任意一个方法;。 这种动态获取的信息以及动态调用对象...

    JAVA反射机制的简单理解

    有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic ...是可以通过反射机制来实现“动态”,用一个实例来说明一下:

    java 类加载机制和反射详解及实例代码

    主要介绍了java 类加载机制和反射详解及实例代码的相关资料,需要的朋友可以参考下

    候捷谈Java反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...

    Java的反射机制讲解案例代码 Class类、 获取类的结构信息:构造函数、方法和字段,动态创建对象、调用方法和设置属性

    适用于有一定Java编程基础的开发人员,希望了解和应用Java反射机制的使用者。 使用场景及目标 使用反射机制的典型场景包括以下几个方面: 在运行时动态加载和创建类对象。 通过反射调用对象的方法和访问对象的字段...

    利用JAVA的反射机制动态加载struts中的form

    利用java的反射机制动态加载form,以使得这部分代码能够被重用,是很好的一个重用代码机制的体现

    java反射机制

    该文件有如何动态加载类,动态获得属性,动态调用方法,动态创建对象等

    java反射机制介绍

    这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods...

    java 利用java反射机制动态加载类的简单实现

    下面小编就为大家带来一篇java 利用java反射机制动态加载类的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java的反射机制深度解析

    ava语言允许通过程序化的方式间接的对Class操作,Class文件由类加载器加载后,在JVM中将形成一份描述Class的对象,通过该对象可以获知Class的结构信息,如构造函数,属性,方法等。并分别通过Java实例对这些信息进行...

Global site tag (gtag.js) - Google Analytics