反射中Method类的invoke() 和getMethod()[通俗易懂]

反射中Method类的invoke() 和getMethod()[通俗易懂]就是调用类中的方法,最简单的用法是可以把方法参数化。invoke(class,method);  MethodClass.getMethod(Stringname,Class<?>…parameterTypes)的作用是获得对象所声明的公开方法该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型…

大家好,又见面了,我是你们的朋友全栈君。

就是调用类中的方法,最简单的用法是可以把方法参数化。invoke(class, method);

 

 

Method Class.getMethod(String name, Class<?>… parameterTypes)的作用是获得对象所声明的公开方法

该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。

person.getClass().getMethod(“Speak”, null);

//获得person对象的Speak方法,因为Speak方法没有形参,所以parameterTypes为null

person.getClass().getMethod(“run”, String.class);

//获得person对象的run方法,因为run方法的形参是String类型的,所以parameterTypes为String.class

如果对象内的方法的形参是int类型的,则parameterTypes是int.class

 

//getMethod第一个参数是方法名,第二个参数是该方法的参数类型,
//因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法

 

Method method = XXX.getClass().getMethod(methodName,new Class[0]);

 //第一个参数是具体调用该方法的对象
 //第二个参数是执行该方法的具体参数反射中Method类的invoke() 和getMethod()[通俗易懂]    

 

如一个函数 int Test(int a, String str);

对应的getMethod方法:

1.  getMethod(“Test”,int.class,String.class);

2. getMethod(“Test”,new Class[]{int.class,String.class});

//Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,返回值总是对象。

 

 //如果参数为基本类型数据,必须转换为相应的包装类型的对象。

 

 

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

InvokeObj.java:

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 sum){

        return sum;
    }
}
 

MethodInvokeTest.java:

 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MethodInvokeTest {

    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {

        
        Class<InvokeObj> clazz=InvokeObj.class;
        Method[] methods=clazz.getMethods();
        //输出了Class类型的所有方法。
        System.out.println(“以下输出InvokeObj类的方法”);
        for(Method method:methods){

            System.out.println(method);
        }
        System.out.println();
        
         System.out.println(“InvokeObj类的无参show()方法:”);
         Method method1=clazz.getMethod(“show”,null);
        //会执行无参show()方法
         Object obj=method1.invoke(new InvokeObj(),null);
         System.out.print(“输出无参show()方法的返回值:”+obj);
         System.out.println();System.out.println();
        
         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();
        
         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();   
        
         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();
            
            System.out.println(“InvokeObj类的intShow()方法: “);  
            Method method5 = clazz.getMethod(“intShow”, int.class);  
            int num = (Integer) method5.invoke(new InvokeObj(), 89);  
            System.out.println(“intShow()方法的返回值: ” + num);     
            
        
    }

}
反射中Method类的invoke() 和getMethod()[通俗易懂]

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125281.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu16.04安装教程_刚安装ETC不能马上使用吗

    ubuntu16.04安装教程_刚安装ETC不能马上使用吗Ubuntu的安装与使用1、请参考:https://jingyan.baidu.com/album/ca00d56c2b5257e99febcf41.html?picindex=29注意网络连接选

    2022年8月1日
    2
  • CNN卷积神经网络及图像识别

    CNN卷积神经网络及图像识别CNN卷积神经网络及图像识别前言神经网络(neualnetworks)是人工智能研究领域的一部分,当前最流行的神经网络是深度卷积神经网络(deepconvolutionalneuralnetworks,CNNs),虽然卷积网络也存在浅层结构,但是因为准确度和表现力等原因很少使用。目前提到CNNs和卷积神经网络,学术界和工业界不再进行特意区分,一般都指深层结构的卷积神经网络,层数从”几层“到”几十上百“不定。CNNs目前在很多很多研究领域取得了巨大的成功,例如:语音识别,图像识别,图像分割,

    2022年6月6日
    32
  • uva 10555 – Dead Fraction)(数论)

    uva 10555 – Dead Fraction)(数论)

    2022年2月1日
    48
  • spring boot自动配置原理面试题_Spring boot面试

    spring boot自动配置原理面试题_Spring boot面试前言SpringBoot框架是开发中的一大利器,其简化了spring的xml的配置,遵循了”约定大于配置“的原则,使用注解对常用的配置做默认配置,减少使用xml配置模式。SpringBoot为常用框架封装了大量的starter,比如spring-boot-starter-web会整合springmvc和内嵌的tomcat。SpringBoot在底层封装了默认的配置,修改配置在application.yml全局配置文件。如今在pom.xml文件中引用starter就可以使用这个框架,使用…

    2022年8月21日
    38
  • jsp分页功能实现两种方法(html如何实现分页功能)

    本期的jsp入门学习内容:实现JSP分页显示的方法。今天给大家带来实现jsp分页显示的代码,简单的7个步骤就可以实现JSP的分页显示,有需要的朋友可以参考一下,学习些jsp开发的知识。正式开始此次的jsp入门教程的学习:1、MySQL的limit关键字(DAO)2、jQuery load函数(页面JS)MySQL的limit关键词能够完结抽取必定规模(n

    2022年4月17日
    272
  • linux zip 删除源文件,linux zip命令参数及用法详解–linux压缩zip文件命令[通俗易懂]

    linux zip 删除源文件,linux zip命令参数及用法详解–linux压缩zip文件命令[通俗易懂]linux命令的基本用法是:zip[参数][打包后的文件名][打包的目录路径]linuxzip命令参数列表:-a将文件转成ASCII模式-F尝试修复损坏的压缩文件-h显示帮助界面-m将文件压缩之后,删除源文件-n特定字符串不压缩具有特定字尾字符串的文件-o将压缩文件内的所有文件的最新变动时间设为压缩时候的时间-q安静模…

    2022年10月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号