本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

JAVA反射基础

发布于2021-05-29 21:20     阅读(1106)     评论(0)     点赞(3)     收藏(1)


目标

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

知识点

类加载机制:

  • 因为类加载流程是:

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();
        }
    }

原文链接:https://blog.csdn.net/qq_33146717/article/details/117297279



所属网站分类: 技术文章 > 博客

作者:我是个大美女

链接:http://www.javaheidong.com/blog/article/207492/8dc04a1104d5a3539e7d/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)