用Java反射API为POJO设值

在Java源文件被编译成.class文件时,会生成一个名为Class的class,俗称类对象,许多人感觉类对象很难,  其实不然,他就是一个名字为类的类,他可以得到他所代表的那个类的所有信息,包括方法,字段,构造器,父类,接口等等,下面是利用反射为POJO设值的一个小实例,以免自己忘记:

 

import  java.lang.reflect. * ;
import  java.util.Random;
public   class  ReflectTest
{
    
    
private static final Random rand = new Random();    
    
public static String getStringGenerator()
    
{
        String[] ss 
=new String[]{
            
new String("zhangsan"),
            
new String("lisi"),
            
new String("wangwu"),
            
new String("myblog"),
        }
;
        
return ss[rand.nextInt(ss.length)];
    }

    
public static void main(String[] args)
    
{
        Class
<?> c;
        
try
        
{
            
//得到Class对象
            if(args.length==0)
            
{
                
return;
            }

            c 
= Class.forName(args[0]);
            Constructor[] cst 
= c.getConstructors();
            Object[] oj 
= null;
            Object o 
= null;
            
for(int i=0;i<cst.length;i++)
            
{
                Class[] cc 
= cst[i].getParameterTypes();
                
if(cc.length==1)
                
{
                    String type 
= cc[0].getName();
                    
if(type.equals("java.lang.String"))
                    
{
                        oj 
= new Object[]{getStringGenerator()};
                        o 
= cst[i].newInstance(oj);
                    }

                    
//System.out.println(type);
                    
                }

            }

            

            
/*得到getter/setter方法*/
            Method[] ms 
= c.getDeclaredMethods();
            String name
="";
            
            
for(int i=0;i<ms.length;i++)
            
{
                
//得到方法的名字
                name=ms[i].getName();
                
if(name.startsWith("set"))
                
{
                    
/* 按照POJO类里面的书写顺序,得到set方法的参数*/
                    Class[] cc 
= ms[i].getParameterTypes();
                    
//如果cc.length==1,就说明每个set方法只有一个参数
                    if(cc.length==1)
                    
{
                        
//得到参数的类型名字
                        String type=cc[0].getName();
                        
//System.out.println(type);
                        
                        
/*下面可以得到属性的名字
                        try
                        {
                            String prop = Character.toLowerCase(name.charAt(3))+name.substring(4);
                            System.out.println(prop);
                        }
                        catch(Exception e)
                        {
                            e.printStackTrace();
                        }
*/

                        
                        
if(type.equals("java.lang.String"))
                        
{
                            ms[i].invoke(o,
new Object[]{getStringGenerator()});
                        }

                        
                    }

                }

            }

            System.out.println(((Person)o).getName());    

        }

        
catch(IllegalArgumentException e)
        
{
            e.printStackTrace();
        }

        
catch(Exception e)
        
{
            e.printStackTrace();
        }
 
    }

}

最后的invoke(Object o,Object[]..)是调用POJO的方法第一个参数表明你要调用哪个POJO类,第二个参数是传参数给你要调用的那个方法,不过只是把这些参数放在了一个Object数组里面,按顺序传递,

 

其中用于测试的Person类如下,很简单的一个JavaBean

 

class  Person
{
    
private int id;
    
private String name;
    
    
public Person()
    
{
        
    }

    
    
public Person(String name)
    
{
        
this.name=name;
    }

    
    
public void setId(int id)
    
{
        
this.id=id;
    }

    
    
public int getId()
    
{
        
return id;
    }

    
    
public void setName(String name)
    
{
        
this.name=name;
    }

    
    
public String getName()
    
{
        
return name;
    }

}

在取得构造器的时候,不会按你书写的顺序得到构造器,而是哪个构造器参数多就先取得哪个,依次下来,所以在取构造器用来得到实例的时候要注意构造器数组的下标,

更多帮助请查看官方中文帮助文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值