java之反射概述

类加载器和反射 



类加载器:

1 类的加载过程:
  当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步骤来实现对这个类进行初始化。
  加载:就是指将class文件读入内存,并为之创建一个Class对象。任何类使用时系统都会建立一个Class对象
  连接:验证,是否有正确的内部结构,并和其他类协调一致。
  准备,负责为类的静态成员分配内存,并设置默认初始化值
  解析,将类的二进制数据中的符号引用替换为直接引用
  初始化:开辟栈、堆内存空间,创建对象、默认初始化、显示初始化、构造初始化

2 类的加载时机
  1)创建类的实例
  2)访问类的静态变量、或者为类的静态变量赋值
  3)调用类的静态方法
  4)使用反射方法来强制创建某个类或者接口对象的java.lang.Class对象
  5)初始化某个类的子类:初始化子类时,首先加载其父类
  6)直接使用java.exe命令来运行某个主类

3 类加载器的主要作用:
   负责将.class文件加载到内存,并为之生成对应的Class对象

4 类加载器的组成
  1)根类加载器:Bootstrap ClassLoader(我们使用的String等类)
    也称为引导类加载器,负责java核心类的加载。比如,System Object String等,在JDK中的JRE的lib目录下rt.jar文件中
  2)扩展类加载器:Extension ClassLoader
    负责JRE的扩展目录中jre包的加载。在JDK中JRE的lib目录下ext目录
  3)系统类加载器:System ClassLoader(加载我们自己写的)
    负责在JVM启动时加载来自java命令的class文件以及classpath环境变量所指的jar包和类路径



反射:

1 反射机理
     java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种
      动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
      即:通过class文件对象,去使用该文件中的成员变量、构造方法、成员方法

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

2 获取Class对象的方式:必须得到class字节码文件对象,其实就是得到Class类的对象
  假设该People.java打包在 com.hzw.pojo.People 。
  1)通过Object类的getClass()方法
    创建一个对象,通过getClass方法获取Class对象:
    People p = new People();
    Class people = p.getClass();//返回此 Object 的运行时类对象。

  2)通过Class类的静态方法forName(),根据全类名获取Class对象
    Class people = Class.forName("com.hzw.pojo.People");

  3)数据类型(基本和引用)的静态属性class
    Class people = People.class;
    Class c = int.class;      //自动装箱
    Class c1 = String.class;
     注意:一般,开发中使用第二种,因为第二种是一个字符串,而不是一个具体的类名。这样就可以把这样的字符串配置到配置文件中。

3 Class对象

Class类:常用类
  成员变量:Field
  构造方法: Constructor
  成员方法:Method
反射:通过Class类的方法获取以上的三个对应的对象,然后通过Filed/Method/Contructor对象调用其方法去真正的使用类的成员、方法、构造

4 反射的使用
1)反射之构造使用:
  主要方法:
    Constructor<T> getContructor(Class<?>... paramTypes)
  参数:parameterTypes - 参数数组 (class类型的参数)
  返回值:一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。

   
    Constructor<?>[] getContructors()
    返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

    Constructor<T> getDeclaredContructor(Class<?>... paramTypes)
    参数:parameterTypes - 参数数组 
    返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。

    Constructor<?>[] getDeclaredContructors()
    返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。

实例:
  Class c = Class.forName("com.hzw.pojo.People"); //获取Class文件对象
  Contructor con = c.getContructor();//获取它的指定构造函数对象,此处是默认构造
  Object obj = con.newInstance();//通过该构造函数对象创建一个实例
  System.out.println(obj);//直接打印该对象,即调用该对象实例的toString()方法

2)反射之成员使用:
主要方法:
  Field getDeclaredField(String name)
  参数:name - 字段名 
  返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。

  Field[] getDeclaredFields()
  返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

  Field getField(String name)
  参数:name - 字段名 
  返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

  Field[] getFields()

  返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

3)反射之成员方法:

主要方法:
  Method getMethod(String name, Class<?>... parameterTypes)
  返回一个 Method 对象,返回此 Class 对象所表示的类或接口的公共成员方法。
  参数:name - 方法名   parameterTypes - 参数列表 
  
  Method[] getMethods()
  返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口的公共成员方法。

  Method getDeclaredMethod(String name, Class<?>... parameterTypes)
  参数:name - 方法名     parameterTypes - 参数数组 
  返回:一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法(不分什么修饰符修饰,都可以获取到)

  Method[] getDeclaredMethods()
  返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

5 使用时遇到IllegalAccessException异常时,要调用setAccessible( boolean flag)方法,设置取消java语言访问检查。

public void setAccessible(boolean flag)  throws SecurityException将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 
时间: 2024-12-21 00:25:56

java之反射概述的相关文章

跟王老师学反射(一):反射概述

跟王老师学反射(一) java反射概述 主讲教师:王少华   QQ群号:483773664 学习目标: 理解Java反射机制 一.什么是Java反射 现实生活,我们会看到这样的现象,在很多影视城,会看到很多山寨版的古代的建筑,比如故宫,但是由于年代久远,故宫的建筑图纸,丢失了(我们假设故宫的图纸丢失了),这样我们就必须依据现在的故宫实体建筑,画出它的图纸,然后依据现画好来的图纸,来建造山寨版的故宫.这样一个由实物得到图纸的过程,我们也可以称之为"反射过程" Reflection(反射)

Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合.我们还可以对某对象所需要的其它对象进 行注入,这种注入都是在配置文件中做的,Spring的IOC的实现原理利用的就是Java的反射机制, Spring还充当了工厂的角色,我们不需要自己建立工厂类.S

如何利用缓存机制实现JAVA类反射性能提升30倍

一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> 分享者:宜信支付结算部支付研发团队高级工程师陶红 原文首发于宜信支付结算技术团队公号:野指针 在实际工作中的一些特定应用场景下,JAVA类反射是经常用到.必不可少的技术,在项目研发过程中,我们也遇到了不得不运用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