java之反射

一、类的加载

当程序要使用某个类时,如果该类还没有被加载到内存中,则系统会通过加载、连接、初始化三步来实现对这个类进行初始化。

加载:就是指将class文件读入到内存中,并为之创建一个Class对象。任何类被使用的时候,系统都会建立一个Class对象。

连接:1)验证 是否有正确的内部结构,并和其他类协调一致 2)准备 负责为类的静态成员分配内存,并设置默认初始化值 3)解析 将类的二进制数据中的符号引用替换为直接引用。

初始化:就是进行属性初始化、构造初始化等等。

二、类的初始化时机

1.创建类的实例

2.访问类的静态变量,或者为静态变量赋值

3.访问类的静态方法

4.使用反射方式来强化自创建某个类或者接口对应的Class对象

5.初始化某个类的子类

6.直接使用java.exe命令来运行某个朱磊

三、类加载器

负责将.class文件加载到内存中,并为之生成对应的Class对象。

虽然我们不需要关系类的加载机制,但是了解这个机制,我们就能更好的理解程序的运行。

类加载器的组成:

根类加载器:BootStrap ClassLoader,也称为引导类加载器,负责java核心类的加载,比如System、String等。在JDK中JRE的lib目录下rt.jar文件中。

扩展类加载器:Extension ClassLoader,负责JRE的扩展目录中jar包的加载。在JDK中JRE的lib目录中的ext目录。

系统类加载器:System ClassLoader,负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和路径。

通过上面的描述,我们知道我们常用的东西的加载都是由谁来完成的,到目前为止,我们已经知道把class文件加载到内存了,那么,如果我们仅仅站在这些class文件的角度,我们如果来使用这些class文件的内容呢?这就是反射

四、反射

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

要想解剖一个类,必须先获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。

反射获取class文件对象的三种方式

package cn7;
/**
 * 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
 * 
 * 要想这样使用,首先你必须得到class文件镀锡,其实也就是得到Class类的对象。
 * Class类:
 *      成员变量 Field
 *      构造方法 Constructor
 *      成员方法 Method
 * 获取class文件对象的方式:
 * 1.Object类的getClass()方法
 * 2.数据类型的静态属性class
 * 3.Class类中的静态方法forName(String className)
 * 
 * 一般我们在开发中使用的是第三种,因为它传入的是一个字符串,而不是一个具体的类名,这样我们就可以把这样的字符串配置到配置文件中。
 */
publicclass ReflectDemo {
    publicstaticvoid main(String[] args) throws Exception {
        //方式1
        Person p = new Person();
        Class<? extends Person> c = p.getClass();
        Person p2 = new Person();
        Class<? extends Person> c2 = p2.getClass();
        
        System.out.println(p == p2);//false
        System.out.println(c==c2);//true
        
        //方式2
        Class<? extends Person> c3 = Person.class;
        System.out.println(c2==c3);//true
        
        //方式3
        Class<?> c4 = Class.forName("cn7.Person");
        System.out.println(c == c4);//true
    }
}
时间: 2024-10-19 10:44:41

java之反射的相关文章

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.

Java:反射

初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的内部信息(包括其modifiers(如public, static等).superclass(如Object).interfaces(如Serializable),也包括fields和methods的所有信息),动态地生

java的反射机制

一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦! 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.反射

黑马程序员——JAVA基础-反射

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都只能都调用它的任意一个 方法和属性,这种动态获取的信息一级动态调用对象的方法的功能呢个称为java 的反射机制. 反射其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象, 并将字节码文件中的内容都封装成对象,这样便于操作这些成员.就是把JAVA类中的各种成

Java 中反射机制的深入研究

昨天学习了java的反射机制,今天继续深入学习一下. 一.通过反射操作数组 反射不光只能用在类中,也可用在任意的引用数据类型上.当然包括数组. 通过java.lang.reflect.Array 类 可操作数组,java.lang.reflect.Array 类 下面提供了很多方法. 例如 public static Object get(Object array,int index)throws IllegalArgumentException,ArrayIndexOutOfBoundsExc

java中反射学习整理

转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力. java中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装载,无须在组件之间进行链接.反射允许在编写与执行时,使程序能够接入到jvm中的类的内部信息,而不是源代码中选定的类协作的代码.这使反射成为构建灵活应用代码的主要工具.需要注意的是,如果使用不当,反射的成本会很高. package

Java 类反射机制分析

一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection.(大家看到这个单词,第一个想法应该就是去开发文档中搜一下了.)它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法.Reflection机制

java中反射

反射 避免硬编码 类对象 (存储了类的信息的对象 类加载的产物) Class 类名.class 直接获得类对象 (简单类型的类对象 int.class) 类的对象.getClass() Class.forName("类名") 通过类名主动加载一个类并获得类对象 类对象.newInstance() 创建类的对象 java中反射,布布扣,bubuko.com

理解Java的反射与内省及其区别

java的内省机制和反射机制什么区别 内省操作只针对JavaBean,只有符合JavaBean规则的类的成员才可以采用内省API进行操作....而反射则不同,一个类的所有成员都可以进行反射操作. 内省和反射的操作也有很大不同,内省是先得到属性描述器PropertyDecriptor后再进行各种操作,反射则是先得到类的字节码Class后再进行各种操作的. 反射(reflection)(实现可扩展性智能化) 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对

黑马程序员-java基础-反射基础

------- android培训.java培训.期待与您交流! ---------- java的反射机制是java的特性之一,反射机制是构建框架技术的基础所在,使用反射可以使程序更加灵活,避免将程序写死在代码里.相对于很多初学者只接触过java基础的人,反射还是一个很朦胧难懂的概念,下面我们就来说一下反射的一些应用. java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能.java反射有3个动态性质:1.运行时生成对象实例,2.运行期间调用发放,3.运行时更改属性. 那么反射