Java进阶—–反射

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),为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象。