zoukankan      html  css  js  c++  java
  • 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调用使用了反射








































  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/chentging/p/7111097.html
Copyright © 2011-2022 走看看