封装一个通过反射获取对象的方法
需要传递两个参数。一个是类的全限定名称。另一个参数列表,这个参数列表要和要创建对象的构造函数的参数列表类型顺序要一致。比如说要创建的对象的一个构造函数是:
public Person(String name, Integer age)
那么传参必须要是new Object[]{"name",88}
,要保证顺序和类型与构造函数对应。
并且需要注意,如果构造函数中有基本数据类型则会报错。比如说public Person(String name, int age)当使用 Object[]{“name”,88}`作为参数传递时,会将int解析为Integer类型。而又找不到public Person(String name, Integer age)的构造函数,所以报错。
另外,如果param参数传null,必须要待创建的对象有无参构造器
代码:
/**
* @描述:根据类的全限定名获取类对象
* @作者:严磊
* @时间:2018年11月9日 下午5:49:21
* @param className 类的全限定名
* @param classs 加载的类的构造方法的参数,按构造方法的参数类型传。例如: {1,"name",23.89,"year","price","language"}
* @return
* @throws ClassNotFoundException
* @throws Exception
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public Object getObjectByClassName(String className, Object[] params) throws Exception
{
Object obj = new Object();
try
{
//根据类名获取Class对象
Class cla = Class.forName(className);
if ( params != null && params.length > 0 )
{
//参数类型数组
Class[] parameterTypes = new Class[params.length];
//遍历获取参数的类型
for (int i = 0; i < params.length; i++)
{
parameterTypes[i] = params[i].getClass();
}
//根据参数类型获取相应的构造函数
Constructor constructor = cla.getConstructor(parameterTypes);
//根据获取的构造函数和参数,创建实例
obj = constructor.newInstance(params);
}
else
{
//根据无参构造函数创建对象
obj = cla.newInstance();
}
}
catch (ClassNotFoundException e1)
{
logger.error("根据传入的类全限定名加载类的时候出现异常");
throw e1;
}
catch (NoSuchMethodException e2)
{
logger.error("根据参数类型获取相应的构造函数出现异常");
throw e2;
}
catch (InvocationTargetException e3)
{
logger.error("根据获取的构造函数和参数,创建实例时出现异常");
throw e3;
}
return obj;
}
测试:
@Test
public void test5() {
try {
Object[] param = new Object[]{"aa",88};
Person obj = (Person)getObjectByClassName("com.study.testCollectionSort.model.Person", param);
System.out.println(obj.getName());
System.out.println(obj.getAge());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Person 类:
public class Person
{
private String name;
private int age;
public Person()
{
super();
}
public Person(String name, Integer age)
{
super();
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}