【职坐标】Java反射机制总结

一、 什么是反射(反射的概念)
a) 指程序可以访问、检测和修改它本身状态或行为的一种能力
b) 在java中的反射机制
i. 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二、 Java是如何实现反射机制的?
a) Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息
b) 通过class和reflection我们都能获取到哪些信息呢?
1. modifiers(访问权限)
2. superclass(父类信息)
3. 实现之interfaces(实现的接口信息)
4. fields(类的属性)
5. methods(类的方法)
c) 反射机制可以在程序运行时改变fields内容或调用methods
三、 Java的反射机制提供了哪些功能?(所有功能都是在运行时实现)
a) 判断任意一个对象所属的类(判断对象的类型)
i. 获取类的Class对象的方法
1. 通过类型变量获取class(getClass方法)
2. 类.class
3. 使用静态方法Class.forName(类的路径)
4. 基本数据类型通过其装箱类的type属性获取
b) 构造任意一个类的对象(动态构造对象)
i. 通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例 
c) 判断任意一个类所具有的属性和方法(私有属性和方法也可以获取到)
i. 获取类的属性(具体方法详见java API)
1. getFields和getDeclaredFields区别
a) getFields返回的是申明为public的属性,包括父类中定义,
b) getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。
ii. 获取类中的方法(具体方法详见Java API)
d) 调用一个对象的方法
i. 通过反射获取类Method对象,调用Field的Invoke方法调用函数。
四、 Java的反射机制有什么用途?
a) 使用泛型和反射机制对java的数据库查询代码进行封装(达到复用性的目的)
 
	/**
	 * 使用泛型和反射来进行封装
	 * 
	 * Person.class
	 */
	public <T> List<T> operQuery(String sql, List<Object> params, Class<T> cls)
			throws Exception {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<T> data = new ArrayList<T>();
		try {
			conn = getConn();// 建立数据库连接
			pstmt = conn.prepareStatement(sql);// 装载SQL语句
			if (params != null) {
				// 假如有?的sql语句,就去补全
				for (int i = 0; i < params.size(); i++) {
					pstmt.setObject(i + 1, params.get(i));
				}
			}
			rs = pstmt.executeQuery();
			ResultSetMetaData rsd = rs.getMetaData();// 得到表的元数据
			// 可以获得标的结构,比如:有几个列,列名,每个列数据类型
			while (rs.next()) {
				T m = cls.newInstance();
				// 循环获取列名
				for (int i = 0; i < rsd.getColumnCount(); i++) {
					String col_Name = rsd.getColumnName(i + 1);// 获取列名
					Object value = rs.getObject(col_Name);// 获取列所对应的值
					Field field = cls.getDeclaredField(col_Name);// 得到对象的属性
					field.setAccessible(true);// 给私有属性赋访问权限
					field.set(m, value);// 给对象的私有属性赋值
				}
				data.add(m);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeAll(rs, pstmt, conn);
		}
		return data;
	}


b) 注意在使用时。要创建的对象的实体类必须有空的构造方法
五、 反射操作的性能
a) 反射是一种强大的工具,但也存在一些不足。一个主要的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作
b) 不要过分关注反射的效率
反射的效率是一个老生常谈的问题,普通的调用方法,创建类,在反射的情况下需要调用诸多API才能实现,效率当然要比普通情况下低下,但在项目当中真正引起性能问题的地方,绝大数不会是由反射引起的,而反射带给我们的却是如此的美妙,当今的各系列开源框架,几乎都存在反射的身影,而且大量存在更比比皆是,
六、 反射机制的缺点
a) 第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码
b) 使用反射会模糊程序内部实际要发生的事情。
i. 程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射——仅在它可以真正增加灵活性的地方
七、 总结
Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库,但是反射机制在性能和代码描述上有一定的问题,所以所在代码中是否要使用反射机制还需认真考虑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值