Java 反射 ,Method的invoke()方法的使用

来源:互联网 发布:淘宝网打底连衣裙 编辑:程序博客网 时间:2024/05/22 05:34
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.InterruptedExceptionpublic final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic 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()方法的返回值:nullInvokeObj类的show()方法: show方法:hello,world输出有参show()方法: InvokeObj类的arrayShow()方法: arrayShow的数组元素:helloarrayShow的数组元素:worldarrayShow的数组元素:!InvokeObj类的StringShow()方法: StringShow()方法的返回值: Thinking in javaInvokeObj类的intShow()方法: intShow()方法的返回值: 89
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 顾客恶意差评怎么办 淘宝不能看视频怎么办 天猫精灵打不开怎么办 手机淘宝卡死了怎么办 为什么电视盒子打不开怎么办 天猫买了降价了怎么办 试用报告未提交怎么办 试用中心拉黑怎么办 淘宝赠品破了怎么办 淘宝卖家不给赠品怎么办 淘宝赠品有瑕疵怎么办 淘宝赠品不发货怎么办 移动电视没信号怎么办 网络电视死机了怎么办 电视接收网络信号不好怎么办 tcl电视待机打不开怎么办 宽带电视看不了怎么办 电视总是闪退怎么办 电视出现系统更新怎么办 电视一直在更新怎么办 电视更新死机了怎么办 法院打电话不接怎么办 内向不敢辞职怎么办呀 生气后睡不着觉怎么办 被气得睡不着怎么办 一生气就睡不着怎么办 手机接电话声音小怎么办 发微信老公不回怎么办 欠钱没有欠条怎么办 朋友欠钱不还怎么办没欠条 个人欠销售货款怎么办 货款一直不还怎么办 欠钱不接电话找不到人怎么办 欠钱人电话不接怎么办 客户欠款不给怎么办 客户货款打一半怎么办 欠款人不到庭怎么办 别人打电话不接怎么办 百合注册被禁用怎么办? 监控显示未登录怎么办 发票认证了两次怎么办