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)
更多文章:
金士顿nv1和a2000区别(金士顿(500GB SSD固态硬盘 M.2接口(NVMe协议) A2000为什么没有缓)
2023年2月27日 23:30
s6edge刷机包(s6 edge刷机出现无法打开窜行端口com)
2024年5月20日 07:30
三星gtn7100开不了机(三星note2 7100 不能开机)
2023年6月18日 01:50
华为d20082是什么型号(我想问一下华为dub一al20是什么型号)
2023年11月14日 04:40
迪比特智能手机(手机存储卡分那些种类,各自有什么区别和联系)
2024年6月7日 01:50
荣耀play4t pro 鸿蒙(鸿蒙来啦!快来看看有没有你的手机)
2024年9月20日 22:25
高画质卡片机(求行家推荐卡片机、要求画质高一点、光圈大传感好点(不需要长焦)、拍人像多一点、预算不多1500左右)
2024年11月2日 06:15
埃博拉病毒死亡照片(2019年来首例,乌干达报告埃博拉死亡病例,这种病毒致死率有多高)
2024年5月24日 08:35
u盘提示格式化(为什么U盘一插进电脑就提示让我格式化啊,我不想格式化的呀!)
2024年9月18日 08:50
买iphonexs的都是傻子(为什么有人说iphone XR是智商检测机呢)
2024年2月27日 16:10
哪款打印机耗材便宜(哪种打印机型号,打印成本低,耗材好配,速度快)
2024年8月31日 20:05
9800gtx评测(9800GTX+和 8800U 你会选哪个哪个玩游戏更好呢)
2024年4月30日 12:00