java反射机制---方法的反射

前段时间我在使用hibernate的时候突然想到一个问题:我经常要对数据库中某条记录中的某个字段读取后进行判断,一般正规的操作流程是先使用session.get方法读取这条记录,并将其保存进一个hibernate实体中,然后从实体中获取我所需要的字段进行比较。
但是如果操作实在是繁琐,于是我在想如何能写一个通用方法,可以直接读取我所需某个表中的某个字段。但是当初尝试了几种方法都无法实现。最麻烦的地方是,因为我在调用该方法前该方法是不知道我需要实现的实体是哪个,也不知道获取的字段是哪个,也就是说程序需要动态的调用某个类和某个方法。后面由于工作比较紧张这个问题就搁置下来了。
就在昨天我了解了下java的反射机制,它能够将传统的编译时所做的工作放到运行时处理。利用这个技术我发现可以很容易的解决我当初那个问题。
我举个例子:假如我要通过hibernate从user表中读取name字段,传统做法是
//......
User user = session.get(User.class,user.getId());
String name =user.getName();
//.......
这样做的麻烦在于如果我要读取Class表中的ClassName字段的话,那所有的代码都得从写,代码的复用率就很低了。
现在我们采用java的反射技术写一个通用方法来解决这个问题
//.....
/**
* @param clazz类,serializable主键,methodName方法名
* @return 字段的值
* @throws Exception
*/
public Object findHQLByField(Class clazz,Serializable serializable,String methodName) throws Exception {
Object obj=null;
obj=sesson.get(clazz,serializable);

Method method=obj.getClass().getMethod(methodName, null);
return method.invoke(obj, null);

}
//......
String name = (String)findHQLByField(User.class,user.getId(),"getName");
通过findHQLByField这个通用方法,我们可以很方便的获取到某个记录的具体字段,而且当要更换实体和字段时只要替换方法参数就行了。
当然java的反射技术非常强大,这只是非常简单的一个实现而已。我们也可以举一反三,比如我要动态执行某个类的方法时就可以这么做:
//.....
Object obj = Class.forName("User").newInstance();//要实现newInstance方法的类必须有默认的构造函数

Method method=obj.getClass().getMethod("getName", null);//第一个参数是方法名第二个参数是方法参数的类型

return method.invoke(obj, null);//第一个参数是实例,第二个参数是方法的参数值
//.....
这样做的效果和
new User().getName();
是一样的。
如果要开发一个具有高度伸缩性的程序,java反射技术是必不可少的。它能将一些不可能的事变为可能。当然,java反射机制也有它的缺点,最大的缺点也是它的功能太强大了,可以修改被定义为private的属性,同时也破坏了java的面向对象的性质。因此在使用中还是需要慎重的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值