JAVA反射基础

目标

  • 认识类加载流程
  • 认识反射
  • 如何通过反射创建对象

知识点

类加载机制:

  • 因为类加载流程是:

1621998337(1).jpg

java源文件
通过编译称为Class文件
将类加载到JVM中
加载
验证
准备
解析
初始化
进入到JVM运行内存区域中
  • Class文件中包含的内容
    1621998294.jpg

一般情况下创建对象是通过正向创建,也就是提前知道创建那个类,之后对其进行实例化。

    Apple apple = new Apple();

反射就是开始时并不知道需要创建的是什么对象,所以无法通过new进行创建,必须通过JDK提供的方法进行所谓的反射创建对象

反射概念:

反射就是在程序编译时,程序猿并不知道用户所要创建的对象是什么?只有当用户调用时候(程序运行中)才能确定所传入的类是什么,通过获取类的信息进行创建对象,并调用。

常用的通过反射获取Class对象的方式:

  • 使用Class.forName()
    Class clazz = Class.forName("类全路径");
  • 使用.class方式(需要提前知道所传入的类是什么)
    Class clazz = Person.class;
  • 使用类对象的getClass()方法
    Person person = new Person();
    Class clazz = person.getClass();

通过反射创建对象

  • 通过Class对象newInstance()方法
    Person person = (Person) clazz.newInstance();
  • 通过Constructor对象的newInstance()方法
    Constructor<?> constructor = clazz.getConstructor();
    //这里调用无参构造方法
    Person person =(Person) constructor.newInstance();

通过反射获取类的属性,方法,构造器等

        Class<Person> personClass = Person.class;
        //这里通常属性是私有属性,如果使用getFields()只能获取共有属性public
        Field[] fields = personClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName());
            System.out.println(field.getType());
        }
    
    //通过反射构建对象
      Constructor<?> constructor = aClass.getConstructor(Integer.class, String.class);
        Person person = (Person) constructor.newInstance(1, "名称");
        System.out.println(JSONUtil.toJsonStr(person));
        

通过反射自定义BeanUtil工具类

	public static void copyProperties(Object source, Object target){
        try {
            Field[] sourceFields = source.getClass().getDeclaredFields();
            Field[] targetFields = target.getClass().getDeclaredFields();

            for (Field field : sourceFields) {

                for (Field targetField : targetFields) {

                    if ( field.getName().equals(targetField.getName())
                            && field.getType().equals(targetField.getType()) ){

                        field.setAccessible(true);
                        Object value = field.get(source);
                        if (null == value || value.equals("")){
                            continue;
                        }
                        targetField.setAccessible(true);
                        targetField.set(target, value );
                    }
                }
            }
        }  catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值