个人封装的反射调用工具类,感觉比较完整了。
包含如下几个功能的方法
1、反射调用静态不含参方法(不需要实例化对象)
2、反射调用不含参方法(需要实例化对象)
3、反射调用含参实例化方法
注意事项:
1、动态调用方法时,注意基础数据类型的转换
2、动态调用方法时,注意传入参数是对象数组
3、调用的类需要和工具类在同一个包下
工具类
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class JobProxy{
/**当前类所在的包*/
public static final String currrentPackage = JobProxy.class.getPackage().getName()+".";
/***
* 通过反射动态执行类中的静态方法
* @param className 类名
* @param methodName 方法名(无参)
*/
public static void execStaticMethod(String className,String methodName){
try {
Class<?> cls = Class.forName(currrentPackage+className);
Method mthd = cls.getMethod(methodName);
mthd.invoke(cls);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/***
* 通过反射动态执行类中的方法,不含参数
* @param className 类名
* @param methodName 方法名(无参)
*/
public static void execMethod(String className,String methodName){
try {
Class<?> cls = Class.forName(currrentPackage+className);
Method mthd = cls.getMethod(methodName);
Object obj = cls.newInstance();//实例化一个对象,供使用
mthd.invoke(obj);//调用方法
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
/***
* 通过反射动态执行类中的方法,含参数的
* @param className 类名
* @param methodName 方法名(无参)
* * @param objType 调用方法参数类型
* @param args 调用方法的参数
*/
public static void execMethodWithPara(String className,String methodName,Object[] args){
try {
Class<?> cls = Class.forName(currrentPackage+className);
Class<?>[] argsClass = new Class[args.length]; //parameter type
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
if(argsClass[i].equals(Integer.class))//1适配int、Integer
argsClass[i] =Integer.TYPE;
else if(argsClass[i].equals(Boolean.class))//2适配 Boolean、boolean
argsClass[i] =Boolean.TYPE;
else if(argsClass[i].equals(Byte.class))//3适配 Byte、byte
argsClass[i] =Byte.TYPE;
else if(argsClass[i].equals(Long.class))//4适配 Long、long
argsClass[i] =Long.TYPE;
else if(argsClass[i].equals(Double.class))//5适配 Double、double
argsClass[i] =Double.TYPE;
else if(argsClass[i].equals(Float.class))//6适配 Float、float
argsClass[i] =Float.TYPE;
else if(argsClass[i].equals(Character.class))//7适配 Character、char
argsClass[i] =Character.TYPE;
else if(argsClass[i].equals(Short.class))//8适配 Short、short
argsClass[i] =Short.TYPE;
}
Method mthd = cls.getMethod(methodName,argsClass);
Object obj = cls.newInstance();//实例化一个对象,供使用
mthd.invoke(obj,args);//传递参数,调用执行方法
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String name[] = {"张三","李四","wang"};
int s = 60;
Integer in = new Integer(12);
Long l = 5l;
Double d = 5.6d;
Float f = 3.3f;
Short st = 12;
Boolean b = new Boolean(true);
Character c = new Character('c');
Byte by = 122;
execMethod("TestRelect","printNameNew");
execMethodWithPara("TestRelect","printNameNew",new Object[]{name, s});
execMethodWithPara("TestRelect","printNameNew",new Object[]{name, in});
execMethodWithPara("TestRelect","printNameNew",new Object[]{name,l});
execMethodWithPara("TestRelect","printNameNew",new Object[]{name,d});
execMethodWithPara("TestRelect","printNameNew",new Object[]{name,f});
execMethodWithPara("TestRelect","printNameNew",new Object[]{name,st});
execMethodWithPara("TestRelect","printNameNew",new Object[]{name,b});
execMethodWithPara("TestRelect","printNameNew",new Object[]{name,c});
execMethodWithPara("TestRelect","printNameNew",new Object[]{name,by});
System.out.println(currrentPackage);
}
}
测试相关类
public class TestRelect {
public static void printName(){
System.out.println("Test My reflection!!");
}
public void printNameNew(){
System.out.println(this.getClass().getSimpleName());
}
public void printNameNew(String [] name,int tet){
for(String n:name){
System.out.print(n+"\t");
}
System.out.print(tet);
System.out.println();
}
public void printNameNew(String [] name,long tet){
for(String n:name){
System.out.print(n+"\t");
}
System.out.print(tet);
System.out.println();
}
public void printNameNew(String [] name,double tet){
for(String n:name){
System.out.print(n+"\t");
}
System.out.print(tet);
System.out.println();
}
public void printNameNew(String [] name,float tet){
for(String n:name){
System.out.print(n+"\t");
}
System.out.print(tet);
System.out.println();
}
public void printNameNew(String [] name,short tet){
for(String n:name){
System.out.print(n+"\t");
}
System.out.print(tet);
System.out.println();
}
public void printNameNew(String [] name,char tet){
for(String n:name){
System.out.print(n+"\t");
}
System.out.print(tet);
System.out.println();
}
public void printNameNew(String [] name,byte tet){
for(String n:name){
System.out.print(n+"\t");
}
System.out.print(tet);
System.out.println();
}
public void printNameNew(String [] name,boolean tet){
for(String n:name){
System.out.print(n+"\t");
}
System.out.print(tet);
System.out.println();
}
}
代码在附件中