反射

前言#

在 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反射机制深入理解剖析

posted @   colee51666  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示
主题色彩
哥伦布
15°
00:09发布
哥伦布
00:09发布
15°
中雨
西风
3级
空气质量
相对湿度
92%
今天
中雨
15°/22°
周一
中雨
6°/19°
周二
小雨
2°/10°