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. 数据结构实验7:实现二分查找、二叉排序(查找)树和AVL树

    实验7 学号:      姓名:     专业: 7.1实验目的 (1) 掌握顺序表的查找方法,尤其是二分查找方法. (2) 掌握二叉排序树的建立及查找. 查找是软件设计中的最常用的运算,查找所涉及到 ...

  2. ASP.NET MVC如何在页面加载完成后ajax异步刷新

    背景:之前已写过两篇有关Ajax的随笔,这一篇是单独针对在页面加载完成的Ajax操作.比如说打开学生列表页面,先加载页面,然后以Ajax的方式,从数据库中检索相应的学生信息,给浏览者更好的体验. 简单 ...

  3. 如何查看Laravel版本号的三种方法

    1.PHP artisan --version 2.vim vendor/laravel/framework/src/Illuminate/Foundation/Application.php 3:可 ...

  4. 【04】如何确定ruby安装好

        [04]如何确定ruby安装好     命令行里输入 ruby -v 如果正确输出了 ruby 版本号,就OK了       是不是在Windows平台安装的?如果是,先按照楼上说得打开命令行 ...

  5. Java.lang.NoSuchMethodError: 后带 V/Z等字母的

    知道 Java.lang.NoSuchMethodError: 后带 V/Z等字母的 错误,一般都是 jar包冲突引起的,找到冲突的jar包,去掉一个就好

  6. 四、SQL基础知识--约束和视图

    --创建约束的方式 --一.在字段创建时将约束添加到字段之后 CREATE TABLE ZYJ_YUESHU( ZYJ_ID VARCHAR(20) NOT NULL PRIMARY KEY, --创 ...

  7. mongodb 的创建和使用

    1. sudo apt-get install mongodb 2. 登陆数据库: mongo, 3. 创建数据库:use dbname 4. 插入数据: db.dbname.insert({&quo ...

  8. URAL 2040 Palindromes and Super Abilities 2

    Palindromes and Super Abilities 2Time Limit: 500MS Memory Limit: 102400KB 64bit IO Format: %I64d &am ...

  9. PTA 05-树8 File Transfer (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/670 5-8 File Transfer   (25分) We have a netwo ...

  10. python学习之 -- 数据序列化

    json / pickle 数据序列化 序列化定义:把变量从内存中变成可存储或传输的过程称为序列化.反序列化:把变量内容从序列化的对象重新读到内存里称为反序列胡. 序列化模块之--pickle使用注意 ...