• java的反射机制


    理解Java的反射机制对学习Java框架有很大帮助,比如Spring框架的核心就是使用Java反射实现的,同时对做一些Java底层操作也会有帮助,比如字节码操作、自定义注解等。

    什么是反射

    Java反射说的是在运行状态中,对于任何一个类,我们都能够直到这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。这种动态获取对象信息和调用对象方法的功能就是Java的反射机制。

    反射的三种方式

    反射其实就是获取类的字节码文件,也就是.class文件,那么我们就可以通过Class这个对象进行获取。

    【类.class】获取类的字节码文件

    Class clazz = ReflectTest.class;
    System.out.println(clazz.getName()); // com.yanggb.test.ReflectTest

    【实例.getClass()】获取类的字节码文件

    List<String> list = new ArrayList<>();
    Class clazz = list.getClass();
    System.out.println(clazz.getName()); // java.util.ArrayList

    【Class.forName(类的全路径名)】获取类的字节码文件

    try {
        Class clazz = Class.forName("com.yanggb.test.ReflectTest");
        System.out.println(clazz.getName()); // com.yanggb.test.ReflectTest
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    要注意的是,通过类的全路径名获取Class对象,如果找不到这个类会抛出异常,必须手动处理异常。

    这三种方式中,第一种需要导入类的包,依赖性太强;第二种方式已经创建了对象,这个时候其实已经不需要去反射了,显得有些多此一举;第三种方式则不需要这个类一定存在,不存在时可以进行另外的操作(异常处理)。因此一般选用第三种方式做反射操作。

    通过反射获取类的成员变量、成员方法

    获取所有构造方法

    Constructor[] constructors = clazz.getConstructors();
    for (Constructor constructor : constructors) {
        System.out.println(constructor);
    }

    获取所有成员变量

    Field[] fields = clazz.getFields();
    for (Field field : fields) {
        System.out.println(field);
    }

    获取所有成员方法

    Method[] methods = clazz.getMethods();
    for (Method method : methods) {
        System.out.println(method);
    }

    这些方法都封装在Class类中,使用的话可以去查阅API,它提供了丰富的API来满足各种各样的要求,这里就只列举上面这三个方法了。

    反射调用类的成员方法

    反射调用类的方法是通过invoke方法去执行的。

    Method[] methods = clazz.getMethods();
    for (Method method : methods) {
        method.invoke();
    }

    总结

    以上内容就是Java反射机制入门的全部内容了,就是对反射能有一个简单的了解。

    反射机制还有很多的内容呢,要学的东西还很多。但是反射是个好东西,希望你也学得会。

    "你必须精力充沛,才能扛得住世事艰难。"

  • 相关阅读:
    可重入函数
    进程间通信的方法和实现
    Qt之Qprocess
    mysql学习(十二)内置函数
    mysql学习(十一)嵌套查询 排序 分组
    mysql学习(十)多表查询
    ubuntu 12.04 安装谷歌浏览器
    mysql学习(九)sql语句
    mysql学习(八)数据表类型-字符集
    mysql远程连接问题-http://www.cnblogs.com/jerome-rong/archive/2013/03/05/2944264.html
  • 原文地址:https://www.cnblogs.com/yanggb/p/10791009.html
Copyright © 2020-2023  润新知