反射


前言

在 java 开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。其主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的。 java 通常是先有类再有对象,有对象就可以调用方法或者属性, java 中的反射其实是通过 Class 对象来调用类里面的方法

反射可实现的功能

一个类有多个组成部分,例如:成员变量、方法、构造方法等,反射就是加载类,并解剖出类的各个组成部分。反射主要提供以下功能:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
  • 生成动态代理

Class类

在检查一个类之前,必须先获取其 Class 对象。通过获取 Class 对象,可将一个类的方法、变量、接口、类名、类修饰符等信息告诉运行的程序

获取 Class 有三种方式:

Class.forName("完整包名带类名")
对象.getClass()
任何类型.class

相关 api

获取完整的包名和类名

public class reflectTest {
    public static void main(String[] args) throws Exception {
        Class<User> userClass = User.class;
        String name = userClass.getName();
        System.out.println(name);
    }
}

获取父类与实现的接口

public class reflectTest {
    public static void main(String[] args) throws Exception {
        Class<User> clazz = User.class;
        // 获取父类
        Class<?> parentClass = clazz.getSuperclass();
        System.out.println(parentClass.getName());
        // 获取接口
        Class<?>[] interfaces = clazz.getInterfaces();
        for (Class c : interfaces){
            System.out.println(c.getName());
        }
    }
}

通过反射机制实例化对象

public class reflectTest {
    public static void main(String[] args) throws Exception {
        Class<User> clazz = User.class;
//        通过默认构造方法构造,通过setter赋值
//        User user = clazz.newInstance();
//        user.setUserName("tom");
//        user.setPassword("123456");
//        System.out.println(user);

//        通过构造函数赋值,前提是得知道构造函数参数个数与类型,以及在构造函数数组的索引
        Constructor<?>[] constructors = clazz.getConstructors();
//        索引0:无参
//        索引1:全参
        Object user = constructors[1].newInstance("tom", "123");
        System.out.println(user);
    }
}

获取属性名、类型、访问修饰符

public class reflectTest {
    public static void main(String[] args) throws Exception {
        Class<User> clazz = User.class;
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field f : declaredFields) {
            // 访问修饰符
            int modifiers = f.getModifiers();
            String modifierType = Modifier.toString(modifiers);
            // 类型
            Class<?> type = f.getType();
            System.out.println(f.getName() + "---" +type.getName() + "---" + modifierType);
        }
    }
}

获取某个类的全部方法

public class reflectTest {
    public static void main(String[] args) throws Exception {
        Class<User> clazz = User.class;
        Method[] methods = clazz.getMethods();
    }
}

通过 for 循环获得每个方法的 Method 对象后,可以通过getModifiers获取访问修饰符,通过getReturnType获取返回值类型,通过getParameterTypes获取参数类型,
通过getName获取方法名,通过getExceptionTypes获取可抛出异常类型

通过反射机制调用某个类的方法

public class reflectTest {
    public static void main(String[] args) throws Exception {
        Class<User> clazz = User.class;
        // 参数1为方法名
        Method method = clazz.getMethod("saySomething", String.class);
        // 参数2为方法要求参数
        method.invoke(clazz.newInstance(),"hello");
    }
}

通过反射机制操作某个类的属性

public class reflectTest {
    public static void main(String[] args) throws Exception {
        Class<User> clazz = User.class;
        User user = clazz.newInstance();
        Field userNameField = clazz.getDeclaredField("userName");
        // 如果操作private属性需要设置为true
        userNameField.setAccessible(true);
        userNameField.set(user,"tom");
        System.out.println(user);
    }
}

参考内容
java反射机制深入理解剖析

原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/273777.html

(0)
上一篇 2022年7月12日
下一篇 2022年7月12日

相关推荐

发表回复

登录后才能评论