博客
关于我
Java基础之反射
阅读量:249 次
发布时间:2019-02-28

本文共 3069 字,大约阅读时间需要 10 分钟。

反射入门

反射是Java编程中的一个强大工具,允许我们在运行时访问类、字段和方法的信息。虽然在Java 1.5之前,反射功能已经存在,但从那以后它变得更加便捷和强大。对于开发者来说,掌握反射知识是非常有帮助的,尤其是在进行动态编程、测试或调试时。

获取类字节码的三种方法

在使用反射操作之前,我们需要先获取类的字节码。Java提供了三种主要方法:

  • 通过类名获取

    使用Class.class方法,比如:System.classPerson.class。这种方法简单且直接。

  • 通过对象获取

    调用对象的getClass()方法,例如:new Date().getClass()。这种方法在已有对象的情况下特别有用。

  • 通过类名字符串获取

    使用Class.forName("类名")方法,比如:Class.forName("java.util.Date")。这种方法在动态加载类名时尤其有用。

  • 使用反射操作

    反射操作的核心类包括ConstructorFieldMethod。我们可以通过这些类来获取和操作类的相关信息。

    获取构造函数(Constructor)

    反射可以帮助我们访问类的构造函数,甚至私有的。以下是获取和使用构造函数的步骤:

  • 获取构造函数

    使用clazz.getConstructor()获取无参构造函数,或者clazz.getConstructor(String.class, String.class)获取参数化构造函数。

  • 创建实例

    使用Constructor.newInstance()创建实例,注意newInstance()需要参数匹配。

  • 获取所有构造函数

    使用clazz.getConstructors()获取所有公开的构造函数,或者clazz.getDeclaredConstructors()获取所有声明的构造函数。

  • 获取方法(Method)

    反射可以帮助我们获取和调用类的方法,包括私有方法。以下是获取和调用方法的步骤:

  • 获取方法

    使用clazz.getMethod("方法名", 参数类数组)获取特定方法,或者clazz.getMethods()获取所有公开方法。

  • 动态调用方法

    使用method.invoke(obj, 参数)调用方法。注意,invoke方法需要一个目标对象和参数数组。

  • 获取所有方法

    使用clazz.getMethods()获取所有公开方法,或者clazz.getDeclaredMethods()获取所有声明的方法。

  • 获取字段(Field)

    反射可以帮助我们访问类的字段,包括私有字段。以下是获取和操作字段的步骤:

  • 获取字段

    使用clazz.getDeclaredField("字段名")获取特定字段,或者clazz.getFields()获取所有公开字段。

  • 操作字段

    使用field.set(obj, 值)设置字段值,或者field.get(obj)获取字段值。

  • 测试示例

    以下是通过反射操作Person类的一些测试案例:

    测试构造函数

    public static void main(String[] args) {    Class clazz = Person.class;    try {        Constructor constructor = clazz.getConstructor(String.class, String.class);        System.out.println(constructor.getName());        Person person = constructor.newInstance("张三", "20岁");        person.printMsg();        Constructor constructor1 = clazz.getConstructor();        System.out.println(constructor1.getName());        Person person1 = constructor1.newInstance();        person1.printMsg();        Constructor[] constructors = clazz.getConstructors();        for (int i = 0; i < constructors.length; i++) {            Constructor constructor = constructors[i];            System.out.println(constructor.getName());        }    } catch (Exception e) {        e.printStackTrace();    }}

    测试方法

    public static void main(String[] args) {    Class clazz = Person.class;    try {        Object obj = clazz.newInstance();        Method method = clazz.getMethod("printMsg");        method.invoke(obj);        Method[] methods = clazz.getMethods();        if (methods != null && methods.length > 0) {            for (int i = 0; i < methods.length; i++) {                System.out.println(methods[i]);            }        }    } catch (Exception e) {        e.printStackTrace();    }}

    测试字段

    public static void main(String[] args) {    Class clazz = Person.class;    try {        Field field = clazz.getDeclaredField("name");        System.out.println(field.getName());        Field[] fields = clazz.getDeclaredFields();        if (fields != null && fields.length > 0) {            for (int i = 0; i < fields.length; i++) {                System.out.println(fields[i]);            }        }    } catch (Exception e) {        e.printStackTrace();    }}

    总结

    反射是一个强大的工具,通过它我们可以在运行时动态地获取和操作类的字段、方法和构造函数。掌握反射知识可以帮助我们更好地理解Java的内核原理,并在实际开发中灵活运用。

    转载地址:http://ozrs.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现LBP特征提取(附完整源码)
    查看>>
    Objective-C实现LDPC码(附完整源码)
    查看>>
    Objective-C实现least common multiple最小公倍数算法(附完整源码)
    查看>>
    Objective-C实现Lempel-Ziv压缩算法(附完整源码)
    查看>>
    Objective-C实现Length conversion长度转换算法(附完整源码)
    查看>>
    Objective-C实现Levenshtein 距离算法(附完整源码)
    查看>>
    Objective-C实现levenshteinDistance字符串编辑距离算法(附完整源码)
    查看>>
    Objective-C实现lfu cache缓存算法(附完整源码)
    查看>>
    Objective-C实现LFU缓存算法(附完整源码)
    查看>>
    Objective-C实现linear algebra线性代数算法(附完整源码)
    查看>>
    Objective-C实现linear congruential generator线性同余发生器算法(附完整源码)
    查看>>
    Objective-C实现linear discriminant analysis线性判别分析算法(附完整源码)
    查看>>
    Objective-C实现linear regression线性回归算法(附完整源码)
    查看>>
    Objective-C实现linear search线性搜索算法(附完整源码)
    查看>>
    Objective-C实现Linear search线性搜索算法(附完整源码)
    查看>>
    Objective-C实现LinearSieve线性素数筛选算法 (附完整源码)
    查看>>
    Objective-C实现LinkedListNode链表节点类算法(附完整源码)
    查看>>
    Objective-C实现LinkedList链表算法(附完整源码)
    查看>>
    Objective-C实现local weighted learning局部加权学习算法(附完整源码)
    查看>>
    Objective-C实现logistic regression逻辑回归算法(附完整源码)
    查看>>