Java反射调用工具类

个人封装的反射调用工具类,感觉比较完整了。

包含如下几个功能的方法

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();
	}
	
}

代码在附件中

猜你喜欢

转载自shulinshulinzi.iteye.com/blog/2372372
今日推荐