java运行时创建对象

使用JDK自带的反射(java.lang.reflect)或者自省(java.beans.Introspector)运行时创建对象。

有很多场景需要运行时创建对象,比如Copy对象到指定类型的对象中,比如根据指定的字段和值创建指定类型的对像。使用JDK自带的反射(java.lang.reflect)或者自省(java.beans.Introspector)都可以可实现。自省的方式会对类型信息做缓存因而效率更加高,推荐优先使用。

  1. copy对象

两个步骤完成,一是动态创建指定类型的对象,二是获取据源对象属性的值并赋到新对象对应的属性上。

      public static void doCopyNotNull(Class<?> clazz, Object source, Object target) {
        List<Field> fieldArray = getAllFields(clazz);
        if (fieldArray != null && fieldArray.size() > 0) {
            for (Field field : fieldArray) {
                try {
  1. 使用自省创建动态创建对象。

使用场景:创建指定类型的对象并根据key为字段名称value为对应值的java.util.Map初始化对象,对象完成返回给调用方。

特别要强调的是指定的java类型需要符合java bean命名规则。

2.1. 获取指定Class的key为filed的名称,value为PropertyDescriptor的map

2.2 . 创建对象并初始化对象

  • fieldValueMap:以property名称为key值为value的map。
  • clazz:创建对象的类型。

推荐使用自省的方式创建对象,因为自省会缓存类型信息,从而不用每次调用重新获取类型信息,因而可以提高在多次使用时的性能。

查看源码如下:

 public static BeanInfo getBeanInfo(Class<?> beanClass)
        throws IntrospectionException
    {
        if (!ReflectUtil.isPackageAccessible(beanClass)) {
            return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
        }
        ThreadGroupContext context = ThreadGroupContext.getContext();
        BeanInfo beanInfo;
        synchronized (declaredMethodCache) {
            beanInfo = context.getBeanInfo(beanClass);
        }
        if (beanInfo == null) {
            beanInfo = new Introspector(beanClass, null, USE_ALL_BEANINFO).getBeanInfo();
            synchronized (declaredMethodCache) {
                context.putBeanInfo(beanClass, beanInfo);
            }
        }
        return beanInfo;
    }

注意: synchronized (declaredMethodCache) {
beanInfo = context.getBeanInfo(beanClass);
}

首先从缓存中获取bean信息,如果不存在才会重新获取,因此创建多个类型相同的对象时可以大大提高性能 。

Original: https://www.cnblogs.com/sdsxblpjava/p/15767470.html
Author: 同学Zou
Title: java运行时创建对象

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572396/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球