`
Luob.
  • 浏览: 1588676 次
  • 来自: 上海
社区版块
存档分类
最新评论

java 反射List

    博客分类:
  • Java
阅读更多
package com.enhance.reflect;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang.ArrayUtils;

public class ReflectTest {
	public static void main(String[] args) throws Exception{
        //反射List 集合
		reflectCollection();
       } 



/**
	 * 反射获取集合属性 和 集合中的 泛型 
	 * @throws Exception 
	 */
	public static void reflectCollection() throws Exception{
		List<Integer> nums=new ArrayList<Integer>();
		nums.add(1);
		
		Person p =new Person();
		p.setAge(18);
		p.setName("luck");
		
		List<Person> list=new LinkedList<Person>();
		list.add(p);
		
		List<Address> address = new ArrayList<Address>();
		Address addr=new Address();
		addr.setAddName("上海人民广场");
		addr.setAddNo("add001");
		address.add(addr);
		
		p.setAddress(address);
		
		TestA a=new TestA();
		a.setNums(nums);
		a.setP(p);
		a.setAge(16);
		a.setBig(55);
		a.setData(list);
		
		TestB b=new TestB();
		copyProperties(a,b);
		//BeanUtils.copyProperties(b,a); //只能copy 类型相同的,
		System.out.println("基本类型:"+b.getBig());
		System.out.println("包装类型:"+b.getAge());
		System.out.println("自定义类"+b.getP().getAge());
		System.out.println("List<包装类型>:"+b.getNums().get(0));
		System.out.println("List<自定义类>:"+b.getData().get(0).getAge());
		System.out.println("List<自定义类.List>:"+b.getData().get(0).getAddress().get(0).getAddName());
		
	}

/**
     * 能 复制 相同类型的属性
     * 也能复制 "属性名相同,类型不同" 的属性
     * @param src 原对象
     * @param dest 目标对象
     * @throws Exception
     * Person ==> People
     * 注意:本程序省略 NoSuchMethodException 的判断
     *    每获取 Method 都需要判断  NoSuchMethodException 后在 invoke
     */
    public static void copyProperties(Object src,Object dest) {
        Class sclazz =src.getClass();
        Class dclazz =dest.getClass();

        //Object.class 为 stopClass  不反射的 Class
        PropertyDescriptor[] ps= new PropertyDescriptor[0];
        try {
            ps = Introspector.getBeanInfo(dclazz,Object.class).getPropertyDescriptors();
            for (PropertyDescriptor prop : ps) {
                Object srcVal=null;
                try {

                    if(prop.getPropertyType() == Class.class){ //Class 不反射
                        continue;
                    }else if(prop.getPropertyType().isPrimitive()){ //基本数据类型
                        srcVal=getValue(src,sclazz,prop.getReadMethod().getName());
                        if(srcVal !=null){
                            prop.getWriteMethod().invoke(dest,srcVal);
                        }
                    }else if(isWrapType(prop.getPropertyType().getName())){ //包装类型
                        srcVal=getValue(src,sclazz,prop.getReadMethod().getName());
                        if(srcVal !=null){
                            if(prop.getPropertyType().getName().equals("java.lang.Double")){ //Double
                                BigDecimal newVal=new BigDecimal(srcVal.toString());
                                NumberUtil.setScale(newVal,2);
                                prop.getWriteMethod().invoke(dest,  NumberUtil.setScale(newVal,2));
                            }else {
                                prop.getWriteMethod().invoke(dest, srcVal);
                            }
                        }
                    }else if(prop.getPropertyType().getInterfaces() !=null && prop.getPropertyType().getInterfaces().length > 0
                            && prop.getPropertyType().getInterfaces()[0] == Collection.class){ //集合类型
                        Object obj=getValue(src,sclazz,prop.getReadMethod().getName());
                        if(obj !=null && obj instanceof Collection){
                            Collection srcList=(Collection)obj;
                            Class collClazz=obj.getClass();
                            ParameterizedType pt= (ParameterizedType)prop.getReadMethod().getGenericReturnType();
                            Class type = (Class)pt.getActualTypeArguments()[0];
                            Object destList=collClazz.newInstance();
                            Method addMethod=collClazz.getMethod("add",Object.class);
                            if(addMethod !=null) {
                                for (Object object : srcList) {
                                    Object item = null;
                                    if (isWrapType(type.getName())) {
                                        Class parmClazz=String.class;
                                        try{
                                            parmClazz = (Class)object.getClass().getField("TYPE").get(object);
                                        }catch (Exception e) {
                                        }
                                        item = type.getConstructor(parmClazz).newInstance(object);
                                    } else {
                                        item = type.newInstance();
                                        copyProperties(object, item);
                                    }
                                    addMethod.invoke(destList, item);
                                }
                            }
                            prop.getWriteMethod().invoke(dest, destList);
                        }
                    }else{//自定义类型  Class
                        Object d=prop.getPropertyType().newInstance();
                        copyProperties(getValue(src,sclazz,prop.getReadMethod().getName()),d);
                        prop.getWriteMethod().invoke(dest, d);
                    }
                } catch (Exception e) {
                    log.info("copyProperties ERROR:"+ ThrowableUtil.getStackTrace(e));
                }
            }
        } catch (Exception e) {
            log.info("copyProperties ERROR:"+ ThrowableUtil.getStackTrace(e));
        }
    }

    /**
     * 获取属性值
     * @param obj
     * @param clazz
     * @param methodName
     * @return
     */
    public static Object getValue(Object obj,Class clazz,String methodName){
        Object value=null;
        try {
            Method method=clazz.getMethod(methodName);
            if(method !=null){
                value=method.invoke(obj);
            }
        } catch (Exception e) {
            log.info("copyProperties.getValue method: "+methodName+",ERROR"+ ThrowableUtil.getStackTrace(e));
        }
        return value;
    }
	
	/**
	 * 是否是包装类型
	 * @param typeName
	 * @return
	 */
	public static boolean isWarpType(String typeName){
		 String[] types = {"java.lang.Integer",  
			        "java.lang.Double",  
			        "java.lang.Float",  
			        "java.lang.Long",  
			        "java.lang.Short",  
			        "java.lang.Byte",  
			        "java.lang.Boolean",  
			        "java.lang.Character",  
			        "java.lang.String"};  
		return ArrayUtils.contains(types, typeName);
	}

}

public class TestA {
	private List<Integer> nums;
	private Person p;
	private Integer age;
	private int big;
	
	private List<Person> data;
}

public class TestB {
	private List<Integer> nums;

	private Integer age;
	private People p;
	private int big;
	
	private List<People> data;
}

public class People {
	private String name;
	private int age;
	
	List<Address> address;
}

public class Person {

	private String name;
	private int age;
	
	List<Address> address;
}

public class Address {

	private String addNo;
	private String addName;
}


运行结果

  • 大小: 26.7 KB
分享到:
评论

相关推荐

    java反射,获取所有属性、方法以及List集合类

    本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...

    Java反射函数机制实现List转换Json

    本话题将深入探讨如何利用Java反射机制将List对象转换为JSON格式。 在Java中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在处理数据传输或存储...

    java反射获取所有属性,获取所有get方法,包括子类父类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...

    Java 反射封装 JavaBean

    使用 Java 反射封装 JavaBean &lt;br&gt; 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean

    基于java8新特性+反射机制实现list不同实体类互转.zip

    这个压缩包文件“基于java8新特性+反射机制实现list不同实体类互转.zip”提供了一种解决方案,它利用了Java 8的新特性和反射机制来实现这种转换,并将这个功能封装为一个工具类。 首先,Java 8引入了许多新特性,...

    Java 反射详解

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等对象,即使这些对象在编译时并未被明确地引用。这一特性使得Java具有高度的动态性,使得代码能够在运行时检查类的信息...

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    利用java反射将json字符串转成对象.zip

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON...

    Java反射机制课件ppt

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...

    java用list直接生成Excel文件

    利用jxl包结合java反射机制和注释,直接把list生成对应的Excel文件,即只需传入list、对应生成的对象、标题就可以生成excel文件write(String title, List list,Class c),实现一个简单生成excel工具类

    java中list排序

    Java 中 List 排序 Java 中 List 排序是指在数据库中查出来的列表中对不同的字段重新排序。一般的做法都是使用排序的字段,重新到数据库中查询。如果不到数据库查询,直接在第一次查出来的 List 中排序,无疑会提高...

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    java反射获取参数.zip

    这个“java反射获取参数.zip”文件很可能是关于如何利用Java反射获取类的属性、方法,特别是对于List集合类的操作。 首先,我们来详细解释Java反射的基本概念。在Java中,每个类都有一个Class对象,这个对象包含了...

    通过反射从数据库返回集合ResultSet中得到实体对象的list集合

    通过反射从数据库返回集合ResultSet中得到实体对象的list集合

    java反射封装结果集内容到pojo

    当我们从数据库读出数据得到ResultSet或RowSet的时候,我们的做法是遍历结果集,然后封装到pojo里面,再封装到List,那么,每次封装是不是很麻烦呢,前段时间小弟看了下反射的东西,试着写了个类,目的在于方便封装...

    Java-Java反射与泛型教程

    Java反射与泛型是Java编程中的两个重要特性,它们各自为开发者提供了强大的工具来增强代码的灵活性和类型安全性。在本教程中,我们将深入探讨这两个主题,帮助你更好地理解和运用它们。 **Java反射** Java反射机制...

    Java中的反射实现数据库操作

    总的来说,Java反射机制在数据库操作中的应用主要体现在以下几个方面: 1. 动态实例化对象,适应不同的数据模型。 2. 调用对象的通用方法,如CRUD操作。 3. 访问和修改对象的私有属性,对应数据库的字段。 4. 结合`...

    Java反射机制实践

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在"Java...

    java利用反射,将Object和Map进行互相转换,list和map互相转换

    java利用反射,将Object和Map进行互相转换,list和map互相转换 java Map和Object转换,list和map转换

Global site tag (gtag.js) - Google Analytics