个人封装的反射调用工具类,感觉比较完整了。
包含如下几个功能的方法
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(); } }
代码在附件中