Java进阶-----反射
- Java进阶-----反射
- 基础概念
- 什么是反射
- Java代码在计算机中经历的三个阶段
- 反射的好处
- 反射中API的操作
- 获取class对象的方式(3种)
- 源码阶段:Class.forName("全类名"):将字节码文件加载进内存,返回class对象
- class类阶段:类名.class :通过类名的属性class获取
- Runtime运行时阶段:对象.getClass()
- 使用class对象
- class对象的功能
- 反射的基本使用
- 1、获得Class:主要有三种方法
- 2、判断是否为某个类的示例:
- 反射的用途
Java进阶-----反射
基础概念
反射:框架设计的灵魂
什么是反射
将类的各个组成部分封装成其他对象,这就是反射机制
Java代码在计算机中经历的三个阶段
反射的好处
1、在程序的运行过程中,操作这些对象
2、可以解耦(降低程序的耦合程度),提高程序的可扩展性
反射中API的操作
获取class对象的方式(3种)
源码阶段:Class.forName(“全类名”):将字节码文件加载进内存,返回class对象
多用于配置文件,将类名定义在配置文件中,读取文件,返回class对象
class类阶段:类名.class :通过类名的属性class获取
多用于参数传递
Runtime运行时阶段:对象.getClass()
多用于对象的获取字节码文件
使用class对象
class对象的功能
1、获取功能:
(1)获取成员变量
(2)获取构造方法
(3)获取成员方法
(4)获取类名
反射的基本使用
1、获得Class:主要有三种方法
(1)通过class类的静态方法:Class.forName(String className)(最常用)
(2)任何数据类型(包括基本的数据类型)都有一个“静态”的class属性:类名.class
(3)对象.getClass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Fanshe { public static void main(String[] args) { //通过class类的静态方法:forName(String className)(最常用) try { Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名 System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象 } catch (ClassNotFoundException e) { e.printStackTrace(); } //任何数据类型(包括基本的数据类型)都有一个“静态”的class属性 Class stuClass2 = Student.class; System.out.println(stuClass == stuClass2);//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个 //对象.getClass Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。 Class stuClass = stu1.getClass();//获取Class对象 System.out.println(stuClass.getName()); } } |
2、判断是否为某个类的示例:
一般的,我们使用instanceof 关键字来判断是否为某个类的实例。同时我们也可以借助反射中Class对象的isInstance()方法来判断时候为某个类的实例,他是一个native方法。
1 | public native boolean isInstance(Object obj); |
反射的用途
1、反编译:.class–>.java
2、通过反射机制访问java对象的属性,方法,构造方法等
3、当我们在使用IDE,比如Ecplise时,当我们输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就会自动列出他的属性或者方法,这里就是用到反射。
4、反射最重要的用途就是开发各种通用框架。比如很多框架(Spring)都是配置化的(比如通过XML文件配置Bean),为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象。