文档章节

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

之渊
 之渊
发布于 06/23 15:21
字数 809
阅读 8
收藏 0
点赞 0
评论 0

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简单的思路。 通过我的这个方式肯定是可以的实现的。不知道还有没有其他实现的方式。 因为我百度了好久都没有找到。。。 都是百度 到 简单的反射, 没有涉及到集合的,或者 已经知道集合的类型了。。。

上例子代码

public class User {

	public String teString;

	private Integer age;

	private List<Car> cars;

就是 要通过 反射给 cars  这个 List 集合赋值,在不知道 cars 是什么类型集合的情况下。

测试使用的 方法

public class MethodTo {

	public void allCars(User user, Car car, List<Car> cars, ArrayList<Car> alCars, Long a, String[] strs, String str,
			Long[] numarr, Car[] carArray) {
		System.out.println("多少车" + cars.size());
	}



}

 

我这里是 模拟spirngmvc 的访问 方法, 考虑怎么实现它, 

比如 User user 作为参数, 怎么 是给 user 里面的 list<car> 赋值进去的?

 

下面是我的小测试 

public class Test {

	public static void main(String[] args)
			throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		System.out.println(MethodTo.class.getName());
		System.out.println("方法个数" + MethodTo.class.getMethods().length);
		for (Method mt : MethodTo.class.getMethods()) {
			if (mt.getName() != "allCars" && mt.getName() != "testStr") {
				continue;
			}
			

			// 1.8 才有的
			for (Parameter p : mt.getParameters()) {
				System.out.println(p.getName());
			}

			System.out.println("===============");
			System.out.println("方法名称:" + mt.getName());
			System.out.println("方法参数的数量:" + mt.getParameterCount());
			for (Class<?> clz : mt.getParameterTypes()) {
				System.out.println(clz.getName());
				if (clz.isArray()) {
					System.out.println("数组类>>>" + clz.getName());
					System.out.println(clz.getTypeName());
					System.out.println(clz.getCanonicalName());
					System.out.println(clz.getSimpleName());
					System.out.println(clz.getComponentType());
					System.out.println("数组类>>>" + clz.getName());

				}

				if (clz.getName().equals(User.class.getName())) {
					System.out.println(">>>>>>>>>>>>>>>");
					for (Field f : clz.getFields()) {
						System.out.println(f.getName() + "==" + f.getType());
					}
					System.out.println(">>>>>>>>>>>>>>>");
					System.out.println("###############");
					for (Field f : clz.getDeclaredFields()) {
						// 可以获取 私有的 字段属性

						if (f.getGenericType().getTypeName().equals("java.util.List<com.mytest.reflect.Car>")) {
							System.out.println(f.getName() + "==" + f.getType());
							System.out.println(f.getGenericType().getTypeName());
							// 可以通过 截取出 f.getGenericType().getTypeName() : com.mytest.reflect.Car 就知道集合类型的
							Class cc = Class.forName("com.mytest.reflect.Car");
							for (Field fc : cc.getDeclaredFields()) {
								System.out.println(fc.getName());
							}
							Type type = f.getGenericType();

						}

					}
					System.out.println("###############");

				}

				if (clz.getName() == "java.util.List") {
					// list
					// List list = (List) clz.newInstance();
					// list = new ArrayList<>();
					// 通过list 赋值给 明细表 字段里面的内容?
					System.out.println("list里面的 >>>>>");
					System.out.println(clz.getTypeName());
					// System.out.println(clz.getDeclaredFields().length);
					// System.out.println(clz.getFields().length);
					// System.out.println(clz.getComponentType().getName());
					// System.out.println(clz.getDeclaredClasses());
					// System.out.println(clz.getGenericSuperclass().toString());
					// System.out.println(clz.getSuperclass().toString());
					System.out.println(clz.getTypeParameters()[0].getTypeName());
					System.out.println("list里面的 >>>>>");
				}

			}



		}
	}

}

 

 

其实关键就是 这里 

if (f.getGenericType().getTypeName().equals("java.util.List<com.mytest.reflect.Car>")) {
							System.out.println(f.getName() + "==" + f.getType());
							System.out.println(f.getGenericType().getTypeName());
							// 可以通过 截取出 f.getGenericType().getTypeName() : com.mytest.reflect.Car 就知道集合类型的
							Class cc = Class.forName("com.mytest.reflect.Car");
							for (Field fc : cc.getDeclaredFields()) {
								System.out.println(fc.getName());
							}
							Type type = f.getGenericType();

						}

因为 通过控制台可以看到

 f.getGenericType().getTypeName() 

的输出内容是 : java.util.List<com.mytest.reflect.Car>

就可以知道  这个对象里面 有 一个  list 集合属性, 类型是 

com.mytest.reflect.Car

这下子  就可以 通过反射   com.mytest.reflect.Car 

为 car 对象赋值了, 然后 通过 反射 给 这个集合放入 car 对象了。。

3重方式, 先是 反射方法,获取 参数,  User ,

反射 user 或者 List<car> , 反射 car

就可以 了。。。

具体剩下的实现思路 我觉得大家  真的要 写代码用的话,肯定百度很多了。

我就懒得写了,我又目前没用到。。。

 

可以参考 https://www.cnblogs.com/tatame/articles/2417213.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
之渊
粉丝 11
博文 505
码字总数 149495
作品 0
佛山
程序员
自己关于spring的IOC一些理解

最近闲来无事研究了一下IOC底层,于是自己写了一段代码模拟一下spring是如何做依赖注入的。 写框架首先要懂反射,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和...

lvzjane
2012/12/04
0
0
Hibernate反射DAO模式

在持久层框架中,如果我们要像简单的JDBC连接数据库那样写一个通用的Dao方法的话,那么把JDBC简单的业务逻辑搬到hibernate持久层框架中,当然是不可能的,这里主要的问题就在于hibernate持久...

zretc
2013/07/19
0
0
运用类反射机制简化Struts应用程序的开发

Struts中引入ActionForm类的意义与缺陷: 在Struts应用程序中,ActionForm是一个很重要的概念,它的主要功能就是为Action的操作提供与客户表单相映射的数据(如果在客户指定 的情况下,还包括...

红薯
2008/10/05
285
0
Mybatis3.3.x技术内幕(七):Mybatis初始化之六个工具

全民欢庆的五一劳动节,可谓是赏花赏月赏秋香的好季节,炎炎夏日,柳絮飞扬,短裙飞舞,低胸抢镜,是旅游撩妹裸奔等精彩活动的不二选择,不过,这显然与我无关。 终于要开启Mybatis的初始化过...

祖大俊
2016/05/01
1K
5
Spring框架笔记(四)——Spring容器的属性配置详解的六个专题

在spring IOC容器的配置文件applicationContext.xml里,有一些配置细节值得一提。我们将一些问题归结为以下几个专题。 专题一:字面值问题 配置的bean节点中的值,我们提出一个概念——字面值...

HappyBKs
2015/07/13
0
1
Spring的基础知识——IOC与DI

1、IOC (1)、概念:把对象的创建、初始化、销毁等工作交给Spring来做 (2)、Hello World 首先导入必须的jar包 接着创建bean容器配置文件applicationContext.xml(文件名可随意) <?xml ve...

littleant2
2016/01/06
67
0
SpringIOC实现原理(自动注入Bean)使用反射

利用Java代码实现Spring内部IOC实现原理就三步 第一步:解析XML 第二步:获取每个Bean的Class 第三步:利用反射对Bean的私有属性赋值 user.xml 这里运行之后控制台会输出 实现了SpringIOC中的...

码家EDU
2017/10/26
0
0
Spring框架学习之依赖注入

Spring框架从2004年发布的第一个版本以来,如今已经迭代到5.x,逐渐成为JavaEE开发中必不可少的框架之一,也有人称它为Java下的第一开源平台。单从Spring的本身来说,它贯穿着整个表现层,业...

Single_YAM
2017/11/02
0
0
学习Spring(二) -- Spring配置文件基本属性详解

通过构造函数初始化对象 创建一个类后,为类编写带参的构造函数(顺便要编写无参的),在spring配置文件中初始化对象。 package cn.net.bysoft.lesson1; public class Car { public Car() {...

杰克鹏仔
2016/04/15
46
0
Spring容器的属性配置详解的六个专题

在spring IOC容器的配置文件applicationContext.xml里,有一些配置细节值得一提。我们将一些问题归结为以下几个专题。 专题一:字面值问题 配置的bean节点中的值,我们提出一个概念——字面值...

qq948939246
04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MyBatis源码解读之延迟加载

1. 目的 本文主要解读MyBatis 延迟加载实现 2. 延迟加载如何使用 Setting 参数配置 设置参数 描述 有效值 默认值 lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加...

无忌
2分钟前
0
0
javascript 类变量的实现

代码如下: function echo(){ for(let i=0;i<arguments.length;i++) console.log(arguments[i]);}function extend(o, p){for (prop in p) {o[prop] = p[prop]}retur......

backbye
7分钟前
0
1
编程语言对比分析:Python与Java和JavaScript(图)

编程语言对比分析:Python与Java和JavaScript(图): 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?[图] 编程语言生而为何? 我们人类从原始社会就是用语言表达自己,互相沟通...

原创小博客
15分钟前
0
0
Akka构建Reactive应用《one》

看到这Akka的官网,描述使用java或者scala构建响应式,并发和分布式应用更加简单,听着很高级的样子,下面的小字写着消息驱动,但是在quickstart里面又写容错事件驱动,就是这么钻牛角尖。 ...

woshixin
27分钟前
0
0
ffmpeg源码分析 (四)

io_open 承接上一篇,对于avformat_open_input的分析还差其中非常重要的一步,就是io_open,该函数用于打开FFmpeg的输入输出文件。 在init_input中有这么一句 if ((ret = s->io_open(s, &s-...

街角的小丑
28分钟前
0
0
String,StringBuffer ,StringBuilder的区别

不同点 一、基类不同 StringBuffer、StringBuilder 都继承自AbStractStringBuilder,String 直接继承自 Object 2、底层容器“不同” 虽然底层都是字符数组,但是String的是final修饰的不可变...

不开心的时候不要学习
43分钟前
0
0
nodejs 文件操作

写文件code // 加载文件模块var fs = require("fs");var content = 'Hello World, 你好世界!';//params 文件名,内容,编码,回调fs.writeFile('./hello.txt',content,'utf8',function (er......

yanhl
46分钟前
0
0
SpringBoot mybits 查询为0条数据 但是在Navicat 中可以查询到数据

1.页面请求: 数据库查询: 2018-07-16 17:56:25.054 DEBUG 17312 --- [nio-9010-exec-3] c.s.h.m.C.selectSelective : ==> Preparing: select id, card_number, customer_id, customer_nam......

kuchawyz
55分钟前
0
0
译:Self-Modifying cod 和cacheflush

date: 2014-11-26 09:53 翻译自: http://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code Cache处在CPU核心与内存存储器之间,它给我们的感觉是,它具......

我叫半桶水
58分钟前
0
0
Artificial Intelligence Yourself

TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流...

孟飞阳
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部