public Object invoke(Object obj,
Object... args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException

对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。

如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。

如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。

obj - 从中调用底层方法的对象(简单的说就是调用谁的方法用谁的对象)
args - 用于方法调用的参数 
     package test922;  

     public class InvokeObj {  

         public void show() {
System.out.println("无参show()方法。");
}
public void show (String name) {
System.out.println("show方法:" + name);
}
public String[] arrayShow (String[] arr) {
return arr;
}
public String StringShow (String str) {
return str;
}
public int intShow (int num) {
return num;
}
}
     package test922;  

     import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class MethodInvokeTest {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<InvokeObj> clazz = InvokeObj.class;
Method[] methods = clazz.getMethods();
System.out.println("以下输出InvokeObj类的方法:");
for (Method method : methods) {
System.out.println(method);
}
System.out.println("InvokeObj类的无参show()方法:");
Method method1 = clazz.getMethod("show", null);
//会执行无参show()方法
Object obj = method1.invoke(new InvokeObj(),null);
System.out.println("输出无参show()方法的返回值:"+obj);
System.out.println("InvokeObj类的show()方法: ");
Method method2 = clazz.getMethod("show", String.class);
Object obj1 = method2.invoke(new InvokeObj(), "hello,world");
System.out.println("输出有参show()方法: ");
System.out.println("InvokeObj类的arrayShow()方法: ");
Method method3 = clazz.getMethod("arrayShow", String[].class);
String[] strs = new String[]{"hello", "world", "!"};
//数组类型的参数必须包含在new Object[]{}中,否则会报IllegalArgumentException
String[] strings = (String[]) method3.invoke(new InvokeObj(), new Object[]{strs});
for (String str : strings) {
System.out.println("arrayShow的数组元素:" + str);
}
System.out.println("InvokeObj类的StringShow()方法: ");
Method method4 = clazz.getMethod("StringShow", String.class);
String string = (String) method4.invoke(new InvokeObj(), "Thinking in java");
System.out.println("StringShow()方法的返回值: " + string);
System.out.println("InvokeObj类的intShow()方法: ");
Method method5 = clazz.getMethod("intShow", int.class);
int num = (int) method5.invoke(new InvokeObj(), 89);
System.out.println("intShow()方法的返回值: " + num);
}
}
     以下输出InvokeObj类的方法:
public void test922.InvokeObj.show(java.lang.String)
public void test922.InvokeObj.show()
public java.lang.String[] test922.InvokeObj.arrayShow(java.lang.String[])
public java.lang.String test922.InvokeObj.StringShow(java.lang.String)
public int test922.InvokeObj.intShow(int)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
InvokeObj类的无参show()方法:
无参show()方法。
输出无参show()方法的返回值:null
InvokeObj类的show()方法:
show方法:hello,world
输出有参show()方法:
InvokeObj类的arrayShow()方法:
arrayShow的数组元素:hello
arrayShow的数组元素:world
arrayShow的数组元素:!
InvokeObj类的StringShow()方法:
StringShow()方法的返回值: Thinking in java
InvokeObj类的intShow()方法:
intShow()方法的返回值: 89

method.invoke()使用的更多相关文章

  1. java反射机制详解 及 Method.invoke解释

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  2. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  3. (转)Java.lang.reflect.Method invoke方法 实例

    背景:今天在项目中用到Method 的invoke方法,但是并不理解,查完才知道,原来如此! import java.lang.reflect.Method; /** * Java.lang.refl ...

  4. method.invoke()s

    在框架中经常会会用到method.invoke()方法,用来执行某个的对象的目标方法.以前写代码用到反射时,总是获取先获取Method,然后传入对应的Class实例对象执行方法.然而前段时间研究inv ...

  5. method.invoke(...)反射点

    import java.lang.reflect.Method; import java.util.Arrays; /** * @Author: hoobey * @Description: * @D ...

  6. Java反射机制及Method.invoke详解

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  7. 【java】method.invoke(方法底层所属对象/null,new Object[]{实际参数})

    反射调方法时无论是静态/非静态,固定/可变参数,都有Object对象数组对参数进行包装. package com.tn.clas; import java.lang.reflect.Method; i ...

  8. java中Method.invoke方法参数解析

    通过发射的机制,可以通过invoke方法来调用类的函数.invoke函数的第一个参数是调用该方法的实例,如果该方法是静态方法,那么可以用null或者用类来代替,第二个参数是变长的,是调用该方法的参数. ...

  9. Java中Method.invoke方法,反射?

    正常来说,我们调用对象的方法是通过dot运算符来进行的,这里我们介绍另一种方法,有以下几个步骤:1,获取该类的Class Type:2,通过getMethod方法获取Method对象:3,通过调用in ...

随机推荐

  1. java常见问题集锦

    Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案 Eclipse ...

  2. UVA 11090 判负圈问题

    题目链接http://vjudge.net/problem/viewProblem.action?id=34650 题目大意: 给定n个点m条边的加权有向图,求平均权值最小的回路.平均权值=路径权值之 ...

  3. hdu1856 选出更多的孩子

    题目大意: 老师选取2个学生对应的号码,这两人视作朋友,同时朋友的朋友也可以看成自己的朋友. 最后老师选出一个人数最多的朋友圈. 这里学生的人数不大于10^7,所以操作时需要极为注意,操作步数能省则省 ...

  4. ajax请求数据之后在已经有的数据前面打对勾的方法

    今天遇到这么一个需求: 选择一部分人,在点击确定的时候添加到对应的div中,也就是添加到对应的表单下面,当再次查询的时候需要在已经选过的人的复选框前面打伤对勾.

  5. HDU 6035 (虚树)(统计颜色)

    HDU 6035 Colorful Tree Problem : 给一棵树,每个结点有一种颜色,定义每条路径的权值为这条路径上颜色的种数,询问所有路径(C(n,2)条)的权值之和. Solution ...

  6. 小米自动砸蛋机器js代码

    02 //地址:http://static.xiaomi.cn/515 03 //@author:liuzh 04 //@url:http://blog.csdn.net/isea533 05 var ...

  7. 进程&进程池

    进程 服务器中, s.listen(n) n不能无限大,以为内存不可能无限大,n表示内存同一时间接纳的等待连接数,可以看成一个(队列),取出一个拿去建立连接,然后再放进一个,队列中一直保持n个连接 请 ...

  8. HDU 1024 【DP】

    题意: 给n个数将其分成连续的m组,使得这些组的数加和最大,组与组之间可以空数. /* dp[i][j]表示将前j个数分成i个组最大值 状态转移方程是: dp[i][j]=max(dp[i-1][0. ...

  9. json数组原始字符串

    var a = '{"name":"1234"}';var c = '{["name":"张三","age&q ...

  10. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签

    之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻clientTab标签的功能,ActionBarSherlock是在3.0下面的机器支持Ac ...