Java进阶-----反射
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
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方法。
public native boolean isInstance(Object obj);
反射的用途
1、反编译:.class–>.java
2、通过反射机制访问java对象的属性,方法,构造方法等
3、当我们在使用IDE,比如Ecplise时,当我们输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就会自动列出他的属性或者方法,这里就是用到反射。
4、反射最重要的用途就是开发各种通用框架。比如很多框架(Spring)都是配置化的(比如通过XML文件配置Bean),为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象。