Java的反射无疑会让你的代码更加灵活,设计更加多变,耦合性更低,能够写出更漂亮的代码。废话不多说,直接贴出个人写的工具类,应该比较实用。
package com.epoint.utility.code;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* 反射工具类
*
* @author komojoemary
* @version [版本号, 2010-3-16]
*/
public class ReflectUtil
{
/**
* 按照类名反射出它的一个对象
*
* @param classname
* 包名+类名
* @return Object
*/
@SuppressWarnings("rawtypes")
public static Object getObjByClassName(String classname) {
Object obj = null;
if (classname != null) {
try {
Class a = Class.forName(classname);
obj = a.newInstance();
}
catch (InstantiationException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* 按照类名,参数值反射出它的一个对象
*
* @param classname
* 包名+类名
* @param parameter
* 构造函数的参数值
* @return Object
*/
@SuppressWarnings({"unchecked", "rawtypes" })
public static Object getObjByClassNameAndParameter(String classname, Object[] parameter) {
Object obj = null;
if (classname != null) {
try {
Class a = Class.forName(classname);
// 获取公有的构造函数,指定参数
Constructor con = a.getConstructor(getParameterClass(parameter));
obj = con.newInstance(parameter);
}
catch (IllegalArgumentException e) {
e.printStackTrace();
}
catch (InstantiationException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
catch (SecurityException e) {
e.printStackTrace();
}
catch (NoSuchMethodException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* 用类名反射调用它的某个方法(一般针对工具类或者service)(无参数)
*
* @param className
* 类名
* @param methodName
* 方法名
* @return Object
*/
public static Object invokeMethod(String className, String methodName) {
return invokeMethodWithObjHasParame(className, getObjByClassName(className), methodName, new Object[0]);
}
/**
* 用类名反射调用它的某个方法(一般针对工具类或者service)(有参数)
*
* @param className
* 类名
* @param methodName
* 方法名
* @param parameter
* 参数数组
* @return Object
*/
public static Object invokeMethodHasParame(String className, String methodName, Object[] parameter) {
return invokeMethodWithObjHasParame(className, getObjByClassName(