Java_反射机制

Java里的反射机制

  • Java里的一套API

    • Java.lang.reflect包
  • 反射API是Java的 动态 执行机制

    • 可以在运行期间动态加载类
    • 可以在运行期间动态创建对象
    • 可以再运行期间动态访问属性和方法

静态执行

当代码编译完,就能确定的调用关系,在运行期间按照编译结果排序。

Foo f = new Foo();
f.test();

动态执行

与静态相反,在运行期间才能确定的调用执行关系,称为动态。反射API就是用于动态执行的API。

案例:执行某个类中全部的以test为开头的无参数方法。

如上案例只能使用反射API实现:
1、根据指定的类名加载类;
2、动态创建对象;
3、动态查找类中以test为开头的方法;
4、动态执行test为开开头的方法。

反射API

  • 可以在运行期间动态加载类
  • 可以在运行期间动态创建对象
  • 可以再运行期间动态访问属性和方法

Class

Class对象代表类的信息、基本类型信息,Java中任何类型加载内存中都是Class的对象。提供了,动态加载类信息的方法:Class.forName(类名)

class Foo{
    int a = 5;
}
String className = "day01.Foo";
Class cls = Class.forName(className);

Java里的工作方式:

这里写图片描述

技巧:Class对象是使用反射API的入口对象!

利用Class对象可以获取类的所有声明信息
  • cls.getDeclaredFields() 获取全部的属性声明信息
  • cls.getDeclaredMethods() 获取全部的方法信息
Class提供了:动态调用无参数构造器创建对象的方法

方法:cls.newInstance()
功能:运行期间动态创建对象,前提:这个类必须有无参构造器(或默认构造器),否则出现异常!

案例:
//动态加载类
Scanner in = new Scanner(System.in);
String className =in.nextLine();
Class cls = Class.forName(className);
//调用cls.newInstance()  动态创建对象
Object obj = cls.newInstance();
System.out.println(obj);
//测试案例:day01.Foo java.util.ArrayList
//java.io.BufferedInputStream  //异常

如上代码的意义
new ArrayList() 是静态创建对象,事先知道类名
cls.newInstance()是动态创建对象,事先不执行类名,类名是运行期间动态输入的 !

如果在开发中,遇到了不知道类名时候创建对象时候,使用反射动态创建对象。

Class提供了动态查找方法的方法

cls.getDeclaredMethods() 查找全部方法
cls.getDeclaredMethod(方法签名) 查找一个方法

方法签名:方法名+参数类型列表

//查找全部的方法
Method[] methods = cls.getDeclaredMethods();
for(Method m:methods){ //编译擦除
    String name = m.getName();
    Class[]  paramTypes = 
            m.getParamtersTypes();

    if(name.startsWith("test")&& paramType.length==0){
    //m就是以test开头的方法
    //m 代表找到的方法信息
    //m.invoke(对象,传递参数)调用执行m对应的方法
    //对象:this,就是当前对象,实际执行的是:对象.m(传递参数)
    m.invoke(obj,new Object[0]);
    }
}
//遍历全部的方法,找出以test为开头的无参方法 

目的查找以test为开头的方法

Method 提供了动态执行方法的功能

总结 反射

1、何时使用反射:动态加载类型,动态创建对象,动态调用方法,动态访问属性。是Java提供的动态执行API。
2、反射的功能:动态执行
3、反射是Java提供的API,拿来使用即可。
4、反射使用技巧:

  1. Class 对象作为入口:

    • Class.forName,根据类名加载类
    • obj.getClass() ,根据对象找到类
    • 类名.class 已知类名找到Class对象
    • Class cls = String.class;
  2. 创建对象、找到相关类信息(属性、方法)

  3. 动态调用属性、方法

重点方法
- Class.forName
- Class.newInstance
- Method.invoke()

面试:

1、框架底层用什么实现:反射
2、反射的功能是什么:动态加载类,动态创建对象,动态调用方法和属性
3、如何动态调用方法:Method.invoke()
4、如何动态创建对象:Class.newInstance
5、如何动态调用属性:Class.forName
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值