Java民工的铁皮房

Consciousness Of Programming - wjywilliam 想飞,总是会飞的......
posts - 8, comments - 14, trackbacks - 0, articles - 9
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Reflct反射机制一些基本用法

Posted on 2009-02-10 14:40 wjywilliam 阅读(1952) 评论(5)  编辑  收藏 所属分类: Java
PS:若转载发布此文章或相关代码,请注明出处,谢。
最近用到了reflct机制,此前并不熟悉,趁此机会留个底,怕忘记了,只是些小应用而已。

1. 动态匹配方法名字赋值
需求:
一个tempLoan bean里面有几个属性 setPsAddr11,setPsAddr12,setPsAddr13,但是从DB里面取出来的只有一个psAddr1 field值,值是
“A~B~C”的结构。需要分别把值A赋到psAddr11,B赋到psAddr12,C赋到psAddr13。
为了以免后面再增加属性例如4,5,6之类的,不采取手工硬塞动作,故此采取反射,统一逻辑处理。
如下代码:
1Class tempLoanClass = tempLoan.getClass();
2                if(tempLoan.getPsAddr1()!=null){
3                    List<String> psAddress1List = Arrays.asList(tempLoan.getPsAddr1().split("~"));
4                    for (int x = 0; x < psAddress1List.size(); x++{
5                        Method method = tempLoanClass.getDeclaredMethod("setPsAddr1" + (x + 1), new Class[] { String.class });
6                        method.invoke(tempLoan, new Object[] { psAddress1List.get(x) });
7                    }
    
8                }
如上用loop来映射set的方法,由对应的get方法取出来list的元素的值,按照顺序动态赋给tempLoan 的set方法。

2. 根据参数对应Bean里面的变量名,把Bean内所对应的变量的值赋给另一个变量
需求:
根据传入参数一个变量名和一个BO,匹配BO里面的属性,若与传入变量名的值相同,则取BO对应属性的值赋于另一变量
 1public void setValueInField(Loan loan, String fieldName, String fieldValue) throws Exception{
 2        try{
 3            Class tempLoanClass = loan.getClass();
 4            Method[] methods = tempLoanClass.getMethods();
 5            for(int x=0; x<methods.length; x++){
 6                String methodName = methods[x].getName();
 7                if(methodName.indexOf("get")>-1){
 8                    if(methodName.substring(3, methodName.length()).equalsIgnoreCase(fieldName)){
 9                        Object value = methods[x].invoke(loan, new Object[] {});
10                        if(value != null){
11                            fieldValue = value.toString();
12                        }

13                    }

14                }

15            }

16        }
catch(Exception e){
17            e.printStackTrace();
18        }

19    }

3. 这个比较寻常了,就是列出一个Class所有的全局变量名
// Retrieve global variable object in class
   Object obj = new Mytest();
        Field[] fields 
= obj.getClass().getDeclaredFields();
        
for (int i = 0, len = fields.length; i < len; i++{
            String varName 
= fields[i].getName();
            
try {
                
boolean accessFlag = fields[i].isAccessible();
                fields[i].setAccessible(
true);
                Object o 
= fields[i].get(obj);
                System.out.println(
"Include variable:" + varName + " = " + o);
                fields[i].setAccessible(accessFlag);
            }
 catch (IllegalArgumentException ex) {
                ex.printStackTrace();
            }
 catch (IllegalAccessException ex) {
                ex.printStackTrace();
            }

        }


 

评论

# re: Reflct反射机制用法的一些应用  回复  更多评论   

2009-02-10 15:23 by ci
good....

# re: Reflct反射机制用法的一些应用  回复  更多评论   

2009-02-10 23:38 by 与你同飞
java的基本功

# re: Reflct反射机制一些基本用法  回复  更多评论   

2009-03-01 20:25 by baby
Excellent~ support you, wjywilliam

# re: Reflct反射机制一些基本用法  回复  更多评论   

2009-05-23 08:00 by xk
非常不错,有需求有解决办法,我一下就看懂反射了,谢谢!~~~

# re: Reflct反射机制一些基本用法  回复  更多评论   

2009-10-14 17:30 by gggggggg
<script>alert('AA')</script>

只有注册用户登录后才能发表评论。


网站导航: