Java_反射机制

来源:互联网 发布:淘宝怎么设置登录验证 编辑:程序博客网 时间:2024/06/11 13:23

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.newInstance5、如何动态调用属性:Class.forName
0 0