二十六、JavaSE----反射

简介: 二十六、JavaSE----反射

反射



       反射是Java中一个非常重要同时也是一个高级特性,基本上Spring等一系列框架都是基于反射的思想写成的。Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意 一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为 java语言的反射机制。


Java反射机制主要提供了以下这几个功能:


在运行时判断任意一个对象所属的类


在运行时构造任意一个类的对象


在运行时判断任意一个类所有的成员变量和方法


在运行时调用任意一个对象的方法


       反射就像是一个掌控全局的角色,不管程序怎么运行,使用者都能够知道你这个类有哪些属性和方法,这个对象是由谁调用的,反射的优点显而易见。


下面是一个典型的反射类


9.png


与Java反射有关的类主要有


Class类



       在Java中,每定义一个java class实体都会产生一个Class对象。也就是说,当我们编写一个类, 编译完成后,在生成的.class文件中,就会产生一个Class对象,这个Class对象用于表示这个类的类型信息。Class中没有公共的构造器,也就是说Class对象不能被实例化。


其中Class类包括的方法有:


toString()


10.png


        toString()方法能够将对象转换为字符串,toString()首先会判断Class类型是否是接口类型,也就是说,普通类和接口都能够用Class对象来表示,然后再判断是否是基本数据类型,这里判断的都是基本数据类型和包装类,还有void类型。


类型有如下几种:


java.lang.Boolean :代表boolean数据类型的包装类

java.lang.Character:代表char数据类型的包装类

java.lang.Byte:代表byte数据类型的包装类

java.Iang.Short:代表short数据类型的包装类

java.lang.Integer:代表int数据类型的包装类

java.lang.Long:代表long数据类型的包装类

java.lang.Float:代表float数据类型的包装类

java.lang.Double:代表double数据类型的包装类

java.lang.Void:代表void数据类型的包装类


getName()


       这个方法返回类的全限定名称。


如果是引用类型,比如 String.class.getNameQ -> java. lang. String

如果是基本数据类型,byte.class.getNameO -> byte


如果是数组类型,new Object[3]).getClass().getName() -> [L java. lang.Object]


forName()


       根据类名获得一个Class对象的引用,这个方法会使类对象进行初始化。


例如 Class t = Class. forName(" java. lang.Thread")就能够初始化一个 Thread 线程对象


getClassLoader()


       获取类加载器对象。


getDeclaredMethods()


       获得该类所有方法


Field类

       Field类提供类或接口中单独字段的信息,以及对单独字段的动态访问。


equals(Object obj)


       属性与ob j相等则返回true


get(Object obj)


       获得obj中对应的属性值


set(Object obj, Object value)


       设置obj中对应属性值


Method 类

invoke(Object obj, Object... args)


       传递object对象及参数调用该对象对应的方法


ClassLoader 类


       反射中,还有一个非常重要的类就是ClassLoader类,类装载器是用来把类(class)装载进JVM 的。ClassLoader使用的是双亲委托模型来搜索加载类的,这个模型也就是双亲委派模型。


ClassLoader的类继承图如下:


11.png

相关文章
|
7月前
|
Java 编译器 API
JavaSE基础篇:反射(二)
JavaSE基础篇:反射(二)
【JavaSE】Java基础语法(十五):继承
1. 继承的实现 继承的概念 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新 定义,以及追加属性和方法 实现继承的格式 继承通过extends实现 格式:class 子类 extends 父类 { } 举例:class Dog extends Animal { }
|
7月前
|
存储 设计模式 安全
JavaSE基础篇:反射(一)
JavaSE基础篇:反射(一)
JavaSE基础篇:反射(一)
|
7月前
|
Java 编译器
JavaSE基础 --- 类与对象
JavaSE基础 --- 类与对象
67 0
【JavaSE】Java基础语法(十八):接口
1. 接口的概述 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。 Java中接口存在的两个意义 用来定义规范 用来做功能的拓展
【JavaSE】Java基础语法(四十三):反射
概述: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(包括私有的);对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的); 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
【JavaSE】Java基础语法(十六):抽象类
1. 抽象类的概述 当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了! 在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽 象类!
【JavaSE】Java基础语法(二十二):包装类
1. 基本类型包装类 基本类型包装类的作用 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一:用于基本数据类型与字符串之间的转换 基本类型对应的包装类
【JavaSE】Java基础语法(二十一):内部类
1. 内部类的基本使用 内部类概念 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类定义格式
【JavaSE】Java基础语法(二十五):异常
1. 异常 异常的概述 异常就是程序出现了不正常的情况