在做项目时,需要实现这样一个需求:在前台jsp页面中,知道javabean的属性名(该值被存到了数据库中),也知道javabean本对象,想获取该属性的值,怎么实现呢?当时想这不是需要动态的获取类的方法吗?于是想到了反射机制的概念:在运行状态中,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制有这样一个功能:在运行时调用任意一个对象的方法;生成动态代理。这正好符合我的需求。以下把项目中的关键代码贴出来,供大家理解反射机制在项目中的应用:
javabean:
前台jsp页面
其中上述用红线框框起来的就是java反射思想的核心代码:首先根据属性名,先组合方法名(methodname),然后创建Method对象,引用JDKAPI中对该类的描述是:Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息,该类有个public Object invoke( Object obj , Object args)方法,该方法是对带有指定参数的指定对象调用由此 Method
对象表示的底层方法,返回值就是指定对象的该方法的返回值,若该方法为void类型方法,则范围null,否则范围object对象,最终需要强制转换为你所需要的类型。
以下代码是可以运行的测试类,其包含一个学生内部类:
import java.lang.reflect.Method; public class Ceshi { //内部类 学生类 public static class Student{ public String stunum; //学号 public String stuname;//姓名 public String getStunum() { return stunum; } public void setStunum(String stunum) { this.stunum = stunum; } public String getStuname() { return stuname; } public void setStuname(String stuname) { this.stuname = stuname; } } public static void main(String args[]){ Student stu=new Student(); stu.setStuname("李志信"); stu.setStunum("2008111014"); try { Method method=stu.getClass().getDeclaredMethod("getStuname", null); String value=(String)method.invoke(stu, null); System.out.println("学生姓名为:"+value); } catch (Exception e) { e.printStackTrace(); } } }
运行结果为:学生姓名为:李志信;证明了我上述总结的是准确的。