• java 反射机制之 getDeclaredMethod()获取方法,然后invoke执行实例对应的方法


    关于反射中getDeclaredMethod().invoke()的学习,来源于项目中的一行代码:

    SubjectService.class.getDeclaredMethod(autoMatchConfig.getMethodName(), Integer.class).invoke(subjectService, GlobalConfig.OPEN_TO_IPLAN);
                      

    获取反射的方法有:

    第一种:

    Class c = SubjectService.class
    第二种:
    Class c = Class.forName(SubjectService)

    获取到 Class 之后,便可以获取有参方法
    c.getDeclaredMethod(String name, Class<?>... parameterTypes)
    获取本类中的所有方法 (只拿本类中的)
    c.getDeclaredMethods();

    继续解析代码中的
    SubjectService.class.getDeclaredMethod(autoMatchConfig.getMethodName(), Integer.class)

    其中,传入的第一个参数是方法名,第二个参数名是方法参数,传入这两个参数之后,便可以根据方法名和方法参数通过反射获取带有参数的方法

    然后
    MethodName.invoke(subjectService, GlobalConfig.OPEN_TO_IPLAN)
    其中,invoke方法中传入的是上一步获取到的方法的实例对象和方法传入的实参

    由此,通过反射获取方法名和参数名,然后invoke方法注入方法对象和实参,

          getDeclaredMethod:返回Method方法对象;

          invoke:根据传入的对象实例,通过配置的实参参数来调用方法



    简答举个例子:

    package com;
    public class Person {
     
        private int age;
        private String name;
     
        public Person( String name,int age) {
            this.age = age;
            this.name = name;
        }
     
        public Person() {
        }
     
     
        //公有 有参方法
        public void public_show(String str,int i)
        {
            System.out.println("public show "+str+"..."+i);
        }
    
        //公有 无参方法
        public void public_prin()
        {
            System.out.println("public prin");
        }
     
     
        //私有 有参方法
        private void private_show(String str,int i)
        {
            System.out.println("private show "+str+"..."+i);
        }
    
        //私有 无参方法
        private void private_prin()
        {
            System.out.println("private prin");
        }
     
    }
    public class Main {
        public static void main(String[] args)  throws Exception {
     
            //获取字节码文件中 方法 再取出其公有方法
     
            String classname = "com.Person";
            //寻找名称的类文件,加载进内存 产生class对象
            Class cl = Class.forName(classname);
    
            //获取一个Person对象
            System.out.println("获取一个Person对象:");
            Object obj=cl.newInstance();
            System.out.println();
     
     
            //1.获取 公有 无参方法 public void demo2.Person.public_prin()
            Method Person_public_prin=cl.getMethod("public_prin",null);
            System.out.println("获取执行 public void demo2.Person.public_prin() :");
            Person_public_prin.invoke(obj,null);
     
            System.out.println();
     
            //2.获取 公有 有参方法 public void demo2.Person.public_show(java.lang.String,int)
            Method Person_public_show=cl.getMethod("public_show",String.class,int.class);
            System.out.println("获取执行 public void demo2.Person.public_show(java.lang.String,int) :");
            Person_public_show.invoke(obj,"神奇的我",12);
     
            System.out.println();
     
            //3.获取 私有 无参方法 private void demo2.Person.private_prin()
            Method Person_private_prin=cl.getDeclaredMethod("private_prin",null);
            Person_private_prin.setAccessible(true);
            System.out.println("获取执行 private void demo2.Person.private_prin() :");
            Person_private_prin.invoke(obj,null);
     
            System.out.println();
     
            //4.获取 私有 有参方法 private void demo2.Person.private_show(java.lang.String,int)
            Method Person_private_show=cl.getDeclaredMethod("private_show",String.class,int.class);
            Person_private_show.setAccessible(true);
            System.out.println("获取执行 private void demo2.Person.private_show(java.lang.String,int) :");
            Person_private_show.invoke(obj,"神奇的私有",23);
     
            System.out.println();
        }
    
    

    
    
    代码部分来源于:
    https://blog.csdn.net/qq_35146878/article/details/78504268


    
    
  • 相关阅读:
    测试方法与步骤
    团队项目需求分析
    第一次个人作业
    3种shell自动交互的方法
    mysql用户管理
    build web application with golang
    安卓中的LINUX内核
    结对项目小结
    关于aria2-yaaw下载软件
    软工结对项目预览
  • 原文地址:https://www.cnblogs.com/renyuanwei/p/9394247.html
Copyright © 2020-2023  润新知