在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();
}
}
}
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;
}
}
... {
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;
}
}
在取得构造器的时候,不会按你书写的顺序得到构造器,而是哪个构造器参数多就先取得哪个,依次下来,所以在取构造器用来得到实例的时候要注意构造器数组的下标,
更多帮助请查看官方中文帮助文档