java反射遍历实体的所有属性名称和值-自定义和jdk自带类型

本文探讨了Java泛型方法在处理基础数据类型及自定义实体时的问题,通过实例展示了如何根据不同类型(如String、Map)进行针对性处理,避免了对基础类型属性的误操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    问题的产生是由于泛型方法中如果实体本身就是基础数据类型的类该如何对实体进行处理,首先上一段代码吧:

/**
 * @param <T>:声明方法是一个泛型方法,T声明泛型类型
 * @param T 声明返回类型
 * @param classz:泛型类型的具体类型,体现“参数化”
 * @param classz
 * @return
 */
public  static <T> T doParams(Class<T> clazz) throws InstantiationException, IllegalAccessException {
	   T model = null;
	   // 获取实体类的所有属性,返回Field数组
		model = clazz.newInstance();
		Field[] field = model.getClass().getDeclaredFields(); 
		for(Field fields: field){
			String name = fields.getName();
			fields.setAccessible(true); // 私有属性必须设置访问权限
			fields.set(model, "");//可以按照业务需求自定义
			Object resultValue = fields.get(model); 
			// 这里可以编写你的业务代码
			System.out.println(name + ": " + resultValue);
		}
		return model;
}

方法中有个问题如果传入的是String类型,那么model.getClass().getDeclaredFields();就无法安装我们的预期运行,因为我们预期就是操作String实体本身,而不是String实体的属性。看一下调用结果

public static void main(String[] args) throws InstantiationException, IllegalAccessException {
	 String ssss = doParams(String.class);
}
结果:
value: [C@7852e922
hash: 0
serialVersionUID: -6849794470754667710
serialPersistentFields: [Ljava.io.ObjectStreamField;@70dea4e
CASE_INSENSITIVE_ORDER: java.lang.String$CaseInsensitiveComparator@5c647e05

同样的问题发生在Map,Set等集合类型。从这个地方可以看出,泛型方法需要处理的有两种类型的情况,一种是自定义类型,自定义类型将Java Jdk中定义的基础类型作为属性封装。第二种情况是jdk中定义的基础类型,包括基本数据类型,集合等。代码做一下修改如下:

/**
     * @param <T>:声明方法是一个泛型方法,T声明泛型类型
     * @param T 声明返回类型
     * @param classz:泛型类型的具体类型,体现“参数化”
     * @param classz
     * @return
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
	public  static <T> T doParams(Class<T> clazz) throws IllegalArgumentException, IllegalAccessException, InstantiationException {
    	  T model = clazz.newInstance();
		  if (model instanceof Map){ 
			  ((Map) model).put("properties", "sdsddxcxcsdsd");
		  }else if (model instanceof String) { 
			  model = clazz.cast("sdsddxcxcsdsd");
		  }else {
			// 获取实体类的所有属性,返回Field数组
	           	
	           	Field[] field = model.getClass().getDeclaredFields(); 
	           	for(Field fields: field){
	           	    String name = fields.getName();
	           	    fields.setAccessible(true); // 私有属性必须设置访问权限
	           	    fields.set(model, "");//可以按照业务需求自定义
	           	    Object resultValue = fields.get(model); 
	           	    // 这里可以编写你的业务代码
	           	    System.out.println(name + ": " + resultValue);
	           	} 
		  }
		 return model;
    	
	}

输出结果:

public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InstantiationException {

		 HashMap ss = doParams(HashMap.class);
	     System.out.println("HashMap.class,ss.get(\"properties\")="+ss.get("properties"));
	     String ssss = doParams(String.class);
	     System.out.println("String.class="+ssss);
	}
输出结果:
HashMap.class,ss.get("properties")=sdsddxcxcsdsd
String.class=sdsddxcxcsdsd

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值