展开全部
这是我自己写的一个类,用java反射写的。有多个功能。如数据拷贝等。具体请看代码注释32313133353236313431303231363533e58685e5aeb931333332633636(超过10000字不让发。)你可以参考一下完整代码可以到我空间查看 public class BaseClass {
/**
* @描述: 执行指定对象的指定方法(该方法更适合于执行无参的构造方法和有参的方法)
* @param obj 需要执行的对象的实例(如果对象的实例不存在即指定 obj == null,则系统会新创建一个实例);
* @param className 需要执行的对象的实例(如果对象的实例不存在即指定 obj == null,则系统会新创建一个实例);
* @param className 对象的名称(需要添加包名如 com.bin.test.testBean其中com.bin.test为包名testBean为方法名)
* @param methodName 需要执行对象中的方法名称(可通过displayAllMethod(T t))来查看该对象有哪些方法 如:Test对象中有方法
* setAge(int age);则methodName应写为[setAge]
* @param methodParmeterNames 需要执行的方法的参数名 基本类型可直接用int,char等来表示,但是如果是其他类型如List则必需写成java.util.List具体参数类型可通过displayAllMethod(T t)
* 方法来查看该对象的所有方法及需要的参数类型) 同时请注意:methodParmeterNames必须和methodParmeterValues配对出现且数量必须一样;如methodParmeterNames
* 为null则参数methodParmeterValues也必须为null(即无参方法),如methodParmeterNames长度为1,则methodParmeterValues的长度也必须为1
* @param methodParmeterValues 需要执行的方法的参数值 请注意:methodParmeterNames必须和methodParmeterValues配对出现且数量必须一样;如methodParmeterNames
* 为null则参数methodParmeterValues也必须为null(即无参方法),如methodParmeterNames长度为1,则methodParmeterValues的长度也必须为1
* @return
*/
public Object executeMethod(Object obj,String className,String methodName,String[]methodParmeterNames,Object[] methodParmeterValues){
return executeMethod(obj, className, null, null, methodName, methodParmeterNames, methodParmeterValues);
}
/**
* @描述: 执行指定对象的指定方法(该方法更适合于执行无参的构造方法和无参的方法)
* @param obj 需要执行的对象的实例(如果对象的实例不存在即指定 obj == null,则系统会新创建一个实例);
* @param className 对象的名称(需要添加包名如 com.bin.test.testBean其中com.bin.test为包名testBean为方法名)
* @param methodName 需要执行对象中的方法名称(可通过displayAllMethod(T t))来查看该对象有哪些方法 如:Test对象中有方法
* setAge(int age);则methodName应写为[setAge]
* @return
*/
public Object executeMethod(Object obj,String className,String methodName){
return executeMethod(obj, className, null, null, methodName, null, null);
}
/**
* @描述: 执行指定对象的指定方法
* @param obj 需要执行的对象的实例(如果对象的实例不存在即指定 obj == null,则系统会新创建一个实例);
* @param className 对象的名称(需要添加包名如 com.bin.test.testBean其中com.bin.test为包名testBean为方法名)
* @param ConstructorParameterNames 构造方法的参数名 基本类型可直接用int,char等来表示,但是如果是其他类型如List则必需写成java.util.List具体参数类型可通过displayAllConstructor(T t)
* 方法来查看该对象的所有构造方法及需要的参数类型) 同时请注意:ConstructorParameterNames必须和ConstructorParameterValues配对出现且数量必须一样;如ConstructorParameterNames
* 为null则参数ConstructorParameterValues也必须为null(即无参构造方法),如ConstructorParameterNames长度为1,则ConstructorParameterValues的长度也必须为1
* @param ConstructorParameterValues 构造方法的参数值 请注意:ConstructorParameterNames必须和ConstructorParameterValues配对出现且数量必须一样;如ConstructorParameterNames
* 为null则参数ConstructorParameterValues也必须为null(即无参构造方法),如ConstructorParameterNames长度为1,则ConstructorParameterValues的长度也必须为1
* @param methodName 需要执行对象中的方法名称(可通过displayAllMethod(T t))来查看该对象有哪些方法 如:Test对象中有方法
* setAge(int age);则methodName应写为[setAge]
* @param methodParmeterNames 需要执行的方法的参数名 基本类型可直接用int,char等来表示,但是如果是其他类型如List则必需写成java.util.List具体参数类型可通过displayAllMethod(T t)
* 方法来查看该对象的所有方法及需要的参数类型) 同时请注意:methodParmeterNames必须和methodParmeterValues配对出现且数量必须一样;如methodParmeterNames
* 为null则参数methodParmeterValues也必须为null(即无参方法),如methodParmeterNames长度为1,则methodParmeterValues的长度也必须为1
* @param methodParmeterValues 需要执行的方法的参数值 请注意:methodParmeterNames必须和methodParmeterValues配对出现且数量必须一样;如methodParmeterNames
* 为null则参数methodParmeterValues也必须为null(即无参方法),如methodParmeterNames长度为1,则methodParmeterValues的长度也必须为1
* @return
*/
public Object executeMethod(Object obj,String className,String[]ConstructorParameterNames,Object[] ConstructorParameterValues,String methodName,String[]methodParmeterNames,Object[] methodParmeterValues) {
try {
//如果用户未指定一个对象的实例则方法会自动为用户创建一个对象的实例
if(obj==null)obj = getInstance(className, ConstructorParameterNames, ConstructorParameterValues);//创建一个实例
//将用户传递进入的参数转换为相应的class参数类型
Class[] methodParName = getMethodClass(methodParmeterNames);
//从指定对象实例中获取指定方法
Method method = obj.getClass().getMethod(methodName, methodParName);
//执行该实例的某个方法
return method.invoke(obj, methodParmeterValues);
} catch (SecurityException e) {
e.printStackTrace();
return null;
} catch (NoSuchMethodException e) {
e.printStackTrace();
return null;
} catch (IllegalArgumentException e) {
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
e.printStackTrace();
return null;
} catch (InvocationTargetException e) {
e.printStackTrace();
return null;
}
}
/**
* @描述: 创建对象的一个新实例
* @param className 对象的名称(需要添加包名如 com.bin.test.testBean其中com.bin.test为包名testBean为方法名)
* @return Object对象的新实例(创建失败返回null)
*/
public Object getInstance(String className){
return getInstance(className, null, null);
}
/**
* @描述: 创建对象的一个新实例
* @param className 对象的名称(需要添加包名如 com.bin.test.testBean其中com.bin.test为包名testBean为方法名)
* @param parameterNames 构造方法的参数名 parameterNames必须和parameterValues配对出现且数量必须一样;如parameterNames
* 为null则参数parameterValues也必须为null(即无参构造方法),如parameterNames长度为1,则parameterValues的长度也必须为1
* @param parameterValues 构造方法的参数值 parameterValues必须和parameterNames配对出现且数量必须一样;如parameterValues
* 为null则参数parameterNames也必须为null(即无参构造方法),如parameterValues长度为1,则parameterNames的长度也必须为1
* @return Object对象的新实例(创建失败返回null)
*/
public Object getInstance(String className,String[]parameterNames,Object[] parameterValues){
//加载class
try {
Class cls = Class.forName(className);
//将用户传递进入的参数转换为相应的class参数类型
Class[] classPar = getMethodClass(parameterNames);//获取构造方法对应的参数类型
//获取指定对象的构造方法
Constructor cst = cls.getConstructor(classPar);
Object obj = null;
//根据参数类型创建一个对象的实例
if(classPar==null||classPar.length==0){
obj = cst.newInstance(null);
}else{
obj = cst.newInstance(parameterValues);
}
return obj;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SecurityException e) {
e.printStackTrace();
return null;
} catch (NoSuchMethodException e) {
e.printStackTrace();
return null;
} catch (IllegalArgumentException e) {
e.printStackTrace();
return null;
} catch (InstantiationException e) {
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
e.printStackTrace();
return null;
} catch (InvocationTargetException e) {
e.printStackTrace();
return null;
}
}
/**
* @描述:将一个bean中的字段内容 复制到另一个bean上(注意:前提条件为名称相同并且类型相同)
* @param
* @param
* @param t 目标对象(注意:目标对象中必须与源对象中存在名称相同,且类型相同的字段)
* @param s 数据源对象(注意:源对象中必须与目标对象中存在名称相同,且类型相同的字段)
* @return
*/
public T copy(T t, S s){
try {
setValueToBean(t,s);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return t;
}
/**
* @描述:查询该对象的所有构造方法(包含私有方法)
* @param
* @param t
*/
public void displayAllConstructor(T t){
for(int i=0;i
System.out.println(t.getClass().getDeclaredConstructors()[i]);
}
}
/**
* @描述:查询该对象的所有方法(包含私有方法)
* @param
* @param t
*/
public void displayAllMethod(T t){
for(int i=0;i
System.out.println(t.getClass().getDeclaredMethods()[i]);
}
}
/**
* @描述:查询该对象的所有字段(包含私有方法)
* @param
* @param t
*/
public void displayAllField(T t){
for(int i=0;i
System.out.println(t.getClass().getDeclaredFields()[i]);
}
}
//后面的代码删除了。。因过长
本回答由网友推荐
已赞过
已踩过<
你对这个回答的评价是?
评论
收起