• Java反射机制


    # 反射

    ## 什么是反射

    反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法..

    静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行次序

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

    动态执行: 在运行期间才确定创建那个类的对象, 执行那个方法!

    Java 反射API可以实现动态执行!

    案例: 执行某个类中全部的以test为开头的方法. (必须使用使用反射实现)

    反射:

    1. 反射是Java提供的API, 接受API的提供的功能!
    2. 是Java底层的执行机制.

    ## 反射功能

    ### 动态加载类


        Class cls = Class.forName(类名)

    作用: 将类名对应的类加载到方法区, 如果类名错误则抛出异常.


    ### 动态创建对象

        Object obj = cls.newInstance();

    特点:

    - 动态创建对象
    - 可以创建任何对象
    - cls对应的类必须有无参数构造器!!!
    - 如果没有无参数构造器则抛出异常!
    - 反射API利用Constructer API支持有参数构造器, 略...

    ### 反射可以查询类中的方法

    可以返回类中声明的全部方法信息

        Method[] methods = cls.getDeclaredMethods(); 
        for(Method m:methods){
            System.out.println(m);//输出方法信息
        }

        Declared 声明的
        Method 方法

    ### 动态执行方法

    执行方法: 

    1. 必须有对象
    2. 找到对象对应的类型方法信息
        - 方法信息在类上查找

    案例:

        Method m = cls.getDeclaredMethod(方法名);//在类信息上查找一个方法信息
        //m 代表 cls类上的一个方法信息
        Object obj=cls.newInstance();//动态创建对象
        //动态调用(invoke)方法
        Object val = m.invoke(obj);
    完整代码:
      

     1 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
     2       Scanner in = new Scanner(System.in);
     3       String className = in.nextLine();
     4       //动态加载类
     5       Class<?> clas = Class.forName(className);
     6     
     7       //动态创建类对象
     8       Object instance = clas.newInstance();
     9       System.out.println(instance);
    10     
    11       //动态检查类中的公共成员方法信息(包括超类和接口中的公共成员方法)
    12       Method[] methods = clas.getMethods();
    13       for (Method method : methods) {
    14         System.out.println(method);
    15       }
    16     
    17       System.out.println("--------华丽分割线--------");
    18       //动态检查类中的所有方法信息(包括私有和保护的,不包括继承)
    19       Method[] declaredMethods = clas.getDeclaredMethods();
    20       for (Method method : declaredMethods) {
    21         System.out.println(method);
    22       }
    23     
    24       String methodName = in.nextLine();  
    25       Method m = clas.getDeclaredMethod(methodName, null);
    26       //动态执行方法
    27       Object invoke = m.invoke(instance, null);//invoke是方法执行完毕后的返回值
    28       System.out.println(invoke);
    29     }



    ### 反射用途

    1. Eclipse 的快捷菜单使用了反射, 利用反射发现了类的属性和方法
    2. Spring 利用了反射
    •  动态加载类
    • 动态创建Bean
    • 动态注入属性, 包括私有属性注入
    • 动态解析注解

         
        
            3. MyBatis 利用了反射
                - 查询时候, 动态了将查询结果利于反射注入到Bean返回
           4. JUnit 使用了反射
           5. 注解的解析使用了反射
           6. Servlet调用使用了反射








































  • 相关阅读:
    javascript学习_函数调用模式与this取值
    Git 学习笔记(Git教程-廖雪峰)
    Linux学习一周初体验
    前言_写在立冬时
    2021.10.24驾考日记
    大二上学期的HTML杂碎
    AISing Programming Contest 2021(AtCoder Beginner Contest 202)D题题解
    并查集两优化——按秩合并与路径压缩
    [算法板子] 求拓扑序列(拓扑排序)
    浅谈迭代加深搜索 ( IDDFS )
  • 原文地址:https://www.cnblogs.com/chentging/p/7111097.html
Copyright © 2020-2023  润新知