Java反射学习

本文介绍了Java反射的基本概念,包括如何获取Class对象、创建对象、访问属性和方法,以及反射在Spring框架中的实践,如动态装配和代理。通过实例演示了如何利用反射实现类的动态操作和降低代码耦合度。
摘要由CSDN通过智能技术生成

反射

什么是反射

归结为一句话:在运行时才知道操作的类,并且可以获取类的完整构造,并调用对应的方法。

反射能做什么

  • 获取对象的属性,并且能对属性的值进行修改
  • 获取任意类的名称、package信息,所有属性、方法、注解、类型、类加载器等等
  • 实例化任意一个类的对象
  • 调用任意对象的方法
  • 判断任意一个对象所属的类
  • 通过反射我们可以实现动态装配,降低代码的耦合度,动态代理

反射获取Class对象

Class<?> aClass = object.getClass();
Class clazz2 = User.class;
Class<?> aClass = Class.forName("类的全路径");

创建类对象

//class对象创建类对象
Object newInstance = aClass.newInstance();
//无参构造创建对象
Object o = aClass.getConstructor().newInstance();
//有参构造创建对象,String类的参数
Object o1 = aClass.getDeclaredConstructor(String.class).newInstance();

反射获取属性值和名称

public class ReflexTest {
    private void getFiledData(Object object) throws IllegalAccessException {
        Class<?> aClass = object.getClass();
        //获取所有属性对象(public和非public)
        //getDeclaredField(String name)  指定属性名称
        Field[] fields = aClass.getDeclaredFields();
        //父类
        Class<?> superclass = aClass.getSuperclass();
        Field[] superFields = superclass.getDeclaredFields();
        for (Field superField : superFields) {
            //关闭方法的公有或者私有检测
            superField.setAccessible(true);
            //属性值
            Object filedValue = superField.get(object);
            //属性名称
            String filedName = superField.getName();
            //修改属性值
            Object newInstance = aClass.newInstance();
            superField.set(newInstance,"修改后的值");
        }
        for (Field field : fields) {
            field.setAccessible(true);
            Object filedValue = field.get(object);
            String filedName = field.getName();
        }
    }
}

反射获取方法

//指定获取方法
Method method = aClass.getMethod("方法名");
//获取所有public方法
Method[] methods = aClass.getMethods();
//指定获取public和非public的方法
Method declaredMethod = aClass.getDeclaredMethod("方法名");
//获取所有public和非public的方法
Method[] declaredMethods = aClass.getDeclaredMethods();

//调用方法
Object returnValue = declaredMethod.invoke("参数");

反射原理

Java项目编译时,java文件会被编译成.class文件,.class文件在程序运行时会被类加载器加载到JVM中,类被加载后,JVM就会自动产生一个Class对象,该对象就可以获取类的属性/方法/构造方法等等

反射的应用

spring的IOC 、动态配置、动态代理等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值