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

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

Java反射技术详解

反射是Java中一个强大的工具,允许我们在运行时动态获取和操作类、对象的属性、方法。通过反射,我们可以执行一些看起来不可能的操作,比如调用私有方法、动态生成对象等。以下将详细介绍反射的使用方法及其应用场景。

反射的概述

反射的概念源于Java的动态性质。在运行时,对于任何一个类,都可以获取其属性和方法;对于任意一个对象,也可以调用其属性和方法。这种动态获取信息和调用方法的功能,被称为反射。

获取类信息

通过反射,可以获取类的所有信息,包括属性、方法、构造函数等。以下是获取类信息的常用方法。

获取Class对象

获取Class对象可以通过以下方式实现:

  • 使用Class.forName()方法:
  • Class
    class = Class.forName("com.example.Person");
    1. 使用类属性:
    2. Class
      class = Person.class;
      1. 使用对象的getClass()方法:
      2. Person person = new Person();
        Class
        class = person.getClass();

        获取类的属性、方法和构造函数

        获取属性

        反射可以获取类的所有属性,包括私有属性、静态属性等。以下是获取属性的常用方法:

      3. 获取所有属性:
      4. Field[] allFields = class.getDeclaredFields();
        1. 获取指定属性:
        2. Field ageField = class.getDeclaredField("age");
          1. 获取所有公有属性:
          2. Field[] publicFields = class.getFields();
            1. 获取指定公有属性:
            2. Field desField = class.getField("age");

              获取方法

              反射可以获取类的所有方法,包括私有方法、静态方法等。以下是获取方法的常用方法:

            3. 获取所有方法:
            4. Method[] methods = class.getDeclaredMethods();
              1. 获取指定方法:
              2. Method declaredMethod = class.getDeclaredMethod("info", String.class);
                1. 获取所有公有方法:
                2. Method[] allMethods = class.getMethods();
                  1. 获取指定公有方法:
                  2. Method method = class.getMethod("info", String.class);

                    获取构造函数

                    反射可以获取类的构造函数,包括私有构造函数、静态构造函数等。以下是获取构造函数的常用方法:

                  3. 获取所有构造函数:
                  4. Constructor
                    [] allConstructors = class.getDeclaredConstructors();
                    1. 获取指定构造函数:
                    2. Constructor
                      constructor = class.getDeclaredConstructor(String.class);
                      1. 获取所有公有构造函数:
                      2. Constructor
                        [] publicConstructors = class.getConstructors();
                        1. 获取指定公有构造函数:
                        2. Constructor
                          publicConstructor = class.getConstructor(String.class);

                          获取其他信息

                          反射还可以获取类的注解、泛型信息、包信息等。以下是获取这些信息的常用方法:

                        3. 获取注解:
                        4. Annotation[] annotations = class.getAnnotations();
                          Annotation annotation = class.getAnnotation(Deprecated.class);
                          1. 获取泛型信息:
                          2. Type genericSuperclass = class.getGenericSuperclass();
                            Type[] genericInterfaces = class.getGenericInterfaces();
                            1. 获取包信息:
                            2. Package package = class.getPackage();
                              1. 获取类名称和修饰符:
                              2. String name = class.getName();
                                String simpleName = class.getSimpleName();
                                int modifiers = class.getModifiers();
                                1. 获取内部和外部类:
                                2. Class
                                  [] declaredClasses = class.getDeclaredClasses();
                                  Class
                                  declaringClass = class.getDeclaringClass();

                                  生成并操作对象

                                  反射可以用于动态生成对象并操作其属性和方法。以下是常用的操作方法。

                                  生成对象

                                3. 使用newInstance()方法:
                                4. Object obj = class.newInstance();
                                  1. 使用构造函数:
                                  2. Constructor
                                    constructor = class.getDeclaredConstructor(String.class);
                                    Object obj = constructor.newInstance("hello");

                                    调用方法

                                  3. 调用类方法:
                                  4. Object obj = class.newInstance();
                                    Method method = class.getDeclaredMethod("setAge", int.class);
                                    method.invoke(obj, 11);
                                    1. 调用对象方法:
                                    2. Object obj = class.newInstance();
                                      Method method = obj.getClass().getDeclaredMethod("getAge");
                                      Object result = method.invoke(obj);
                                      int age = (Integer) result;
                                      1. 调用私有方法:
                                      2. Method method = class.getDeclaredMethod("privateMethod");
                                        method.setAccessible(true);
                                        method.invoke(obj);

                                        访问成员变量

                                      3. 获取属性值:
                                      4. Object obj = class.newInstance();
                                        Field field = class.getField("age");
                                        field.setInt(obj, 10);
                                        int age = field.getInt(obj);
                                        1. 动态设置属性值:
                                        2. field.set(obj, "new value");

                                          反射与泛型结合

                                          反射在处理泛型时非常有用,可以避免强制类型转换。以下是反射与泛型的结合方法。

                                          获取泛型信息

                                        3. 获取Field的类型:
                                        4. Field f = class.getDeclaredField("score");
                                          Class
                                          a = f.getType();
                                          1. 获取Field的泛型信息:
                                          2. Type gType = f.getGenericType();
                                            if (gType instanceof ParameterizedType) {
                                            ParameterizedType pType = (ParameterizedType) gType;
                                            Type rawType = pType.getRawType();
                                            Type[] typeArgs = pType.getActualTypeArguments();
                                            // 处理泛型参数...
                                            }

                                            动态创建泛型对象

                                          3. 工厂类实现:
                                          4. public class ObjectFactory {
                                            public static
                                            T getInstance(Class
                                            cls) {
                                            try {
                                            return cls.newInstance();
                                            } catch (InstantiationException | IllegalAccessException e) {
                                            throw new RuntimeException(e);
                                            }
                                            }
                                            }
                                            String instance = ObjectFactory.getInstance(String.class);

                                            反射的使用场景

                                            反射技术在以下场景中非常有用:

                                          5. 逆向编码:反编译二进制类文件,获取源代码。
                                          6. 注解框架:如Retrofit、Spring等,用于动态处理注解信息。
                                          7. 事件发布/订阅:如EventBus,用于动态绑定和解绑。
                                          8. 动态类生成:如Gson,用于动态解析JSON数据。
                                          9. 反射技术为开发者提供了极大的灵活性和控制权,使得程序能够在运行时动态操作类和对象,实现多种功能。

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

    你可能感兴趣的文章
    Objective-C实现唯一路径问题的回溯方法的算法(附完整源码)
    查看>>
    Objective-C实现四叉树(附完整源码)
    查看>>
    Objective-C实现四舍五入(附完整源码)
    查看>>
    Objective-C实现四舍五入(附完整源码)
    查看>>
    Objective-C实现四阶龙格库塔法(附完整源码)
    查看>>
    Objective-C实现四阶龙格库塔法(附完整源码)
    查看>>
    Objective-C实现回调实例(附完整源码)
    查看>>
    Objective-C实现图-弗洛伊德FloydWarshall算法(附完整源码)
    查看>>
    Objective-C实现图书借阅系统(附完整源码)
    查看>>
    Objective-C实现图像二维熵的图像信号丢失检测(附完整源码)
    查看>>
    Objective-C实现图像去雾算法(附完整源码)
    查看>>
    Objective-C实现图像处理----resizeImageWidth调整图像宽度算法(附完整源码)
    查看>>
    Objective-C实现图像灰度变换(附完整源码)
    查看>>
    Objective-C实现图像相似度平均值哈希算法(附完整源码)
    查看>>
    Objective-C实现图像相似度平均值哈希算法(附完整源码)
    查看>>
    Objective-C实现图像移动(附完整源码)
    查看>>
    Objective-C实现图层混合算法(附完整源码)
    查看>>
    Objective-C实现图形着色算法(附完整源码)
    查看>>
    Objective-C实现图片dilation operation扩张操作算法(附完整源码)
    查看>>
    Objective-C实现图片erosion operation侵蚀操作算法(附完整源码)
    查看>>