java反射机制简介及简单应用

一,文字理解java反射的概念

反射的概念是由Smith在1982年首次提出来的,主要值程序可以访问,检测修改它本身的状态或行为的一种能力。

java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意属性方法,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

java语言强调万物皆对象,反射就是把java类中的各种成分映射成一个个的Java对象。比如一个java类中有:成员变量,构造方法,方法等信息,反射就是把这些信息解析成一个个的对象。 

二,反射演示

1、获取Class对象的三种方式

1.1 Object ——> getClass();

1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性

1.3 通过Class类的静态方法:forName(String  className)(常用)

package com.xt.ssf.refTest;

import java.lang.reflect.Method;

import org.apache.commons.beanutils.BeanUtils;

public class RefTest {
	
	public static void main(String[] args) {
		BeanUtils bean = new BeanUtils();
		try {
			Class cls = Class.forName("org.apache.commons.beanutils.BeanUtils");
			Class cls1 = bean.getClass();
			Class cls3 = BeanUtils.class;
			Method[] method = cls.getMethods();
			for(Method methods: method){
				System.out.println("方法名"+methods);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

}

三,java反射简单应用

1>,java反射简化servlet应用

我们在对jsp页面的数据进行处理一般在servlet内进行,例如学生信息的增删改查,我们往往需要对于每一个功能创建一个sevrlet,这样不仅要写许多无用的代码,而且容易在使用时发生混乱。假如,我们可以把这些方法都写在一个servlet内,我们在使用时通过方法名调用岂不是很简便,这就用到了上面讲到的java反射机制。下面是使用学生信息的增删改查对于这个简单应用的演示,

package com.xt.ssf.refTest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Student extends BaseServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	
	public void addStu(HttpServletRequest request,HttpServletResponse response){
		
	}
	public void delStu(HttpServletRequest request,HttpServletResponse response){
			
	}
	public void queryAllStu(HttpServletRequest request,HttpServletResponse response){
		
	}
	public void updateStu(HttpServletRequest request,HttpServletResponse response){
		
	}
}
package com.xt.ssf.refTest;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class BaseServlet extends HttpServlet{
	
/**
 * 
*/
private static final long serialVersionUID = 1L;


public void doGet(HttpServletRequest request,HttpServletResponse response){
doPost(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response){
String handler = request.getParameter("handler");
Method method;
try {
method = this.getClass().getDeclaredMethod(handler, HttpServletRequest.class,HttpServletRequest.class);
method.invoke(this,request,response);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}

上述第一个servlet  Student继承了第二个servlet BaseServlet,这样我们就可以将方法都写进第一个servlet,然后在第二个BaseServlet内使用反射得到Student中的方法,根据jsp页面的传来的方法名调用Student内具体的方法,运行方法使用到invoke()函数。这就是使用反射简化servlet代码的基本方法。

2>,java反射简化数据库操作

这个应用主要是使用commons-dbutils架包中的 QueryRunner中的execute(Connection, String, ResultSetHandler<T>, Object...)方法:

执行查询,参数String为要执行的sql查询语句,用来把结果集映射成你想要的结果,ResultSetHandler<T>为一个接口,正是利用实现这个个接口中的handler方法,将数据库的操作封装到一个匿名内部类中,使得数据库的操作更为简便。这里面用到的反射:就是在你只有架包时可以使用反射调用或重写其中的方法实现一些自己的操作。

QueryRunner qr= new QueryRunner();
try {
stuList = qr.execute(conn,sql,new ResultSetHandler(){  //匿名内部类
public List<StuInfo> handle(final ResultSet rs){
final List<StuInfo> stuList = new ArrayList<StuInfo>();
					
try{
while(rs.next()){
StuInfo stu = new StuInfo();
stu.setStuNo(rs.getString("stuno"));
stu.setStuName(rs.getString("stuna"));
stu.setAge(rs.getInt("age"));
stu.setGender(rs.getString("gender"));
stu.setBirthday(rs.getString("birthday"));
stuList.add(stu);
}
}catch(final SQLException e){
e.printStackTrace();
}
return stuList;
}
},null);

上面是具体使用到反射的部分代码。

3>,java反射简化servlet对jsp页面传来数据的处理
这个应用和2>差不多,类似于使用架包内的类的方法处理数据使得数据的操作变得简单。这里使用到了 commons-beanutils 架包中的BeanUtils类中的populate方法将map类型的数据封装转换成bean类型的数据,便于传送。
Map<String,String[]> map = request.getParameterMap();
try {
BeanUtils.populate(st, map);//核心方法
sd.addStu(st);	
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
具体对于java反射的更多底层的原理知识可以 点开链接,十分详细有助于深层次的理解java反射机制。







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值