`
shulinshulinzi
  • 浏览: 8004 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论
阅读更多

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

包含如下几个功能的方法

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

 

代码在附件中

 

 

分享到:
评论

相关推荐

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    java反射机制工具类

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...

    Java反射调用方法

    在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    总结起来,Java反射为我们提供了在运行时操作类、方法和属性的强大工具,包括调用私有方法和获取私有属性值。然而,它也是一把双刃剑,使用时需权衡利弊,确保代码的稳定性和安全性。在处理私有成员时,务必注意对...

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...

    java反射调用实例代码

    这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...

    java反射工具类 ReflectionUtils

    Java反射工具类ReflectionUtils是Java开发中常用的一个辅助类,它可以帮助开发者在运行时检查类、接口、字段和方法的信息,以及动态调用方法和访问字段。反射在Java编程中扮演着重要的角色,特别是在框架开发、插件...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...

    java 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被...

    利用java反射调用实现对字符串的解析,成功调入函数,并且返回值

    在这个场景中,我们关注的是如何利用Java反射调用来解析字符串并执行相关函数,最终获取返回值。下面将详细阐述这个过程。 首先,`ReflectUtils.java` 文件可能包含了一些静态方法,这些方法提供了反射操作的便利...

    Java反射工具类

    Java反射工具类主要指的是`java.lang.reflect`包中的类,它们提供了对类、接口、字段和方法的动态访问能力。这篇博文通过链接可能详细解释了如何利用这些工具类来实现一些高级功能。 1. `Class&lt;?&gt;`: 这是反射的核心...

    通过反射调用静态方法

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等对象。本文将详细讲解如何通过反射调用静态方法,并探讨在特定场景下,如MyBatis中的应用。 首先,理解反射的概念是至...

    frida反射调用对象中的方法与字段.pdf

    本文主要讲解了在遇到需要操作Java对象的参数或返回值时,如何利用Frida这一动态代码插桩工具来进行反射调用,包括调用对象的方法和获取对象的字段。Frida是一个强大的动态代码插桩工具,它可以注入到几乎所有的进程...

    Java反射动态加载实例类

    ### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...

    java反射 java反射 java反射java反射

    - `b.setPwd()`, `b.setAcc()`通过反射调用了`AA`类的方法。 - `testshow(b)`可能是一个用于显示对象信息的自定义方法。 - `Class o=Class.forName("testf.AA")`获取`AA`类的`Class`对象,`o.getName()`返回类的...

    Java 反射创建get set方法及反射方法的调用

    本文介绍了如何使用Java反射机制来创建get和set方法,并通过反射调用这些方法来访问对象的属性。这种方式虽然灵活,但在实际开发中应当谨慎使用,因为它可能会降低代码的性能和可维护性。了解反射机制的基本原理对于...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    Java反射方法调用

    Java反射机制是Java语言提供的一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理不确定类型的对象或者实现动态代理等场景中非常有用。...

    牛逼的java常用工具类

    6. **反射API**:Java反射机制允许程序在运行时动态地获取类的信息(如类名、方法名)并调用它们,这在配置文件驱动的应用、插件系统和单元测试中十分有用。 7. **异常处理**:`Exception`类及其子类构成了Java的...

Global site tag (gtag.js) - Google Analytics