对反射的理解

       在做项目时,需要实现这样一个需求:在前台jsp页面中,知道javabean的属性名(该值被存到了数据库中),也知道javabean本对象,想获取该属性的值,怎么实现呢?当时想这不是需要动态的获取类的方法吗?于是想到了反射机制的概念:在运行状态中,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制有这样一个功能:在运行时调用任意一个对象的方法;生成动态代理。这正好符合我的需求。以下把项目中的关键代码贴出来,供大家理解反射机制在项目中的应用:

        javabean:

091353345.jpg

        前台jsp页面

111840572.jpg

      其中上述用红线框框起来的就是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();
}
}
}

          

    运行结果为:学生姓名为:李志信;证明了我上述总结的是准确的。

 

你可能感兴趣的:(java,反射)