`

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的面向对象的性质。因此在使用中还是需要慎重的。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics