个人封装的反射调用工具类,感觉比较完整了。
包含如下几个功能的方法
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反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...
在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...
总结起来,Java反射为我们提供了在运行时操作类、方法和属性的强大工具,包括调用私有方法和获取私有属性值。然而,它也是一把双刃剑,使用时需权衡利弊,确保代码的稳定性和安全性。在处理私有成员时,务必注意对...
提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...
这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...
Java反射工具类ReflectionUtils是Java开发中常用的一个辅助类,它可以帮助开发者在运行时检查类、接口、字段和方法的信息,以及动态调用方法和访问字段。反射在Java编程中扮演着重要的角色,特别是在框架开发、插件...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...
反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被...
在这个场景中,我们关注的是如何利用Java反射调用来解析字符串并执行相关函数,最终获取返回值。下面将详细阐述这个过程。 首先,`ReflectUtils.java` 文件可能包含了一些静态方法,这些方法提供了反射操作的便利...
Java反射工具类主要指的是`java.lang.reflect`包中的类,它们提供了对类、接口、字段和方法的动态访问能力。这篇博文通过链接可能详细解释了如何利用这些工具类来实现一些高级功能。 1. `Class<?>`: 这是反射的核心...
在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等对象。本文将详细讲解如何通过反射调用静态方法,并探讨在特定场景下,如MyBatis中的应用。 首先,理解反射的概念是至...
本文主要讲解了在遇到需要操作Java对象的参数或返回值时,如何利用Frida这一动态代码插桩工具来进行反射调用,包括调用对象的方法和获取对象的字段。Frida是一个强大的动态代码插桩工具,它可以注入到几乎所有的进程...
### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...
- `b.setPwd()`, `b.setAcc()`通过反射调用了`AA`类的方法。 - `testshow(b)`可能是一个用于显示对象信息的自定义方法。 - `Class o=Class.forName("testf.AA")`获取`AA`类的`Class`对象,`o.getName()`返回类的...
本文介绍了如何使用Java反射机制来创建get和set方法,并通过反射调用这些方法来访问对象的属性。这种方式虽然灵活,但在实际开发中应当谨慎使用,因为它可能会降低代码的性能和可维护性。了解反射机制的基本原理对于...
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...
Java反射机制是Java语言提供的一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性在处理不确定类型的对象或者实现动态代理等场景中非常有用。...
6. **反射API**:Java反射机制允许程序在运行时动态地获取类的信息(如类名、方法名)并调用它们,这在配置文件驱动的应用、插件系统和单元测试中十分有用。 7. **异常处理**:`Exception`类及其子类构成了Java的...