method invoke(java Method invoke 参数问题)
本文目录
- java Method invoke 参数问题
- java反射中method类中的invoke方法是做什么的,他有什么作用
- 使用 method.invoke(obj, args)时的参数问题
- 为什么Interface反射获取的Method可以被invoke
- java Method invoke 抛出异常
java Method invoke 参数问题
可以这样调用:method.invoke(object, new Object{obj1, obj2}});这样相当于object.method(obj1, obj2);请看下面的例子:import java.lang.reflect.Array;import java.lang.reflect.Method;public class Test{ public void print(String string) { System.out.println("print(String string)"); System.out.println(string); } public void print(String ... strings) { System.out.println("print(String ... string)"); for(String string: strings) System.out.println(string); } public static void main(String args) throws Exception { Test test = new Test(); // 调用 print(String string) Method method1 = test.getClass().getMethod("print", String.class); method1.invoke(test, "a"); // 调用 print(String ... strings) Method method2 = test.getClass().getMethod("print", Array.newInstance(String.class, 0).getClass()); method2.invoke(test, new String{"a", "b"}}); }}
java反射中method类中的invoke方法是做什么的,他有什么作用
首先Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传人参数。下面是一个简单的例子。
public class MethodTest{ public static void main(String args) { String names ={"tom","tim","allen","alice"}; Class《?》 clazz = Test.class; try { Method method = clazz.getMethod("sayHi", String.class); for(String name:names) method.invoke(clazz.newInstance(),name); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } }}class Test{ public void sayHi(String name) { System.out.println("Hi "+name); }}
使用 method.invoke(obj, args)时的参数问题
request肯定会传过来一个方法名,假定叫methodName,你的servlet类假定叫MyServlet,然后执行try { Method method = MyServlet.class.getDeclaredMethod(methodName,方法参数类型); Object value = method.invoke(new MyServlet(), 参数); } catch (SecurityException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } catch (IllegalAccessException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } catch (InvocationTargetException e) { // TODO 自动生成 catch 块 e.printStackTrace(); }你的参数最好用Integer类型,这样上面的参数类型改为Integer.class,参数改为你的参数id,参数如果是request传过来的先转换为整型调用哪个方法是你request传过来的方法名决定的比如你调用的方法为update(Integer id,String name){}那么request中传来的方法名为update,Method method =MyServlet.class.getDeclaredMethod(methodName,Integer.class,String.class); Object value = method.invoke(new MyServlet(), 1,"aaa");
为什么Interface反射获取的Method可以被invoke
首先Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传人参数。下面是一个简单的例子。123456789101112131415161718192021222324252627282930313233343536public class MethodTest{public static void main(String args){String names ={"tom","tim","allen","alice"};Class《?》 clazz = Test.class;try{Method method = clazz.getMethod("sayHi", String.class);for(String name:names)method.invoke(clazz.newInstance(),name);} catch (NoSuchMethodException e){e.printStackTrace();} catch (IllegalAccessException e){e.printStackTrace();} catch (IllegalArgumentException e){e.printStackTrace();} catch (InvocationTargetException e){e.printStackTrace();} catch (InstantiationException e){e.printStackTrace();}}}class Test{public void sayHi(String name){System.out.println("Hi "+name);}}
java Method invoke 抛出异常
InvocationTargetException异常由Method.invoke(obj, args...)方法抛出。当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收。示例:package com.zzj.test.reflect; public class Reflect { public void run(int i) throws ZeroException { B b = new B(); b.run(i); } } class B { public void run(int i) throws ZeroException { if (i 《 0) { throw new ZeroException("参数不能小于零!"); } System.out.println("参数:" + i); } } class ZeroException extends Exception { private static final long serialVersionUID = 1L; private String detailMessage; public ZeroException(String detailMessage) { this.detailMessage = detailMessage; } public String getMessage() { return detailMessage; } } 测试:package com.zzj.test.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Test { public static void main(String args) { try { Class《?》 clazz = Class.forName("com.zzj.test.reflect.Reflect"); Method method = clazz.getMethod("run", int.class); method.invoke(clazz.newInstance(), -1); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { System.out.println("此处接收被调用方法内部未被捕获的异常"); e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } } 输出:此处接收被调用方法内部未被捕获的异常 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.zzj.test.reflect.Test.main(Test.java:11) Caused by: com.zzj.test.reflect.ZeroException: 参数不能小于零! at com.zzj.test.reflect.B.run(Reflect.java:13) at com.zzj.test.reflect.Reflect.run(Reflect.java:6) ... 5 more 也可以直接打印目标异常:package com.zzj.test.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Test { public static void main(String args) { try { Class《?》 clazz = Class.forName("com.zzj.test.reflect.Reflect"); Method method = clazz.getMethod("run", int.class); method.invoke(clazz.newInstance(), -1); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { System.out.println("此处接收被调用方法内部未被捕获的异常"); Throwable t = e.getTargetException();// 获取目标异常 t.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } } 输出:此处接收被调用方法内部未被捕获的异常 com.zzj.test.reflect.ZeroException: 参数不能小于零! at com.zzj.test.reflect.B.run(Reflect.java:13) at com.zzj.test.reflect.Reflect.run(Reflect.java:6) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.zzj.test.reflect.Test.main(Test.java:11)
更多文章:
联想a500手机壁纸461(我的也是联想A500 请问下 壁纸怎么弄啊 就是直接把全图设置成壁纸的那种)
2024年5月30日 15:15
vivo申请解锁root官网(vivo手机root权限如何开启,教你简单方式)
2023年10月29日 01:00
华为matebook e2019(华为matebooke2019能装哪种电话卡)
2024年8月23日 17:55
s6edge绿色(三星s6edge LED灯未接来电以前是蓝色的,现在怎么突然变绿色闪烁了呢)
2024年7月25日 07:15
三星7572开不了机(三星手机GT-S7572无法正常开机怎么办)
2023年11月2日 02:50
华为荣耀x4手机多少钱(华为荣耀4x这个手机在市场上售价是多少这个手机怎么样)
2024年7月15日 20:05
360手机管家苹果版(iOS10开始可以使用360手机管家拦截骚扰电话,有什么重大意义)
2024年6月22日 18:05
努比亚z40pro和小米11ultra(华为mate40pro和小米11ultra哪个好)
2024年6月28日 08:45
摩托罗拉edge 30发布(号称最薄5G手机!摩托罗拉Edge 30发布,仅有 6.79 mm薄)
2023年4月29日 12:45
vivo游戏中心官方下载正版(OPPO手机如何下载vivo游戏中心)
2024年7月23日 18:09