zoukankan      html  css  js  c++  java
  • java对过反射调用方法

     
    public class InvokeTester {
        public InvokeTester() {
        }
    
        String str;
    
        public InvokeTester(String str) {
            this.str = str;
        }
    
        public int add(int param1, int param2) {
            return param1 + param2;
        }
    
        public String echo(String msg) {
            return "echo: " + msg;
        }
    
        public String getStr() {
            return "one param ctor" + str;
        }
    
        public static void main(String[] args) throws Exception {
            //直接获取类
            //Class<?> classType = InvokeTester.class;
            //通过完整的类型路径获取类
            Class<?> classType = Class.forName("com.top.utils.InvokeTester");
            //使用newInstance创建对象
            // Object invokeTester = classType.newInstance();
            //使用默认构造函数获取对象
            Object invokeTester = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
            //获取InvokeTester类的add()方法
            Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
            //调用invokeTester对象上的add()方法
            Object result = addMethod.invoke(invokeTester, new Object[]{new Integer(100), new Integer(200)});
            System.out.println((Integer) result);
            //获取InvokeTester类的echo()方法
            Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
            //调用invokeTester对象的echo()方法
            result = echoMethod.invoke(invokeTester, new Object[]{"Hello"});
            System.out.println((String) result);
            //创建有参构造函数的类对象
            Object invokeTester1 = classType.getConstructor(new Class[]{String.class}).newInstance(new Object[]{new String("测试一个带参数的构造调用")});
            //获取方法方式相同
            Method getStrMethod = classType.getMethod("getStr");
            Object str = getStrMethod.invoke(invokeTester1);
            System.out.println(str);
        }
    }
     
    在例程InvokeTester类的main()方法中,运用反射机制调用一个InvokeTester对象的add()和echo()方法
     
    add()方法的两个参数为int 类型,获得表示add()方法的Method对象的代码如下:
    Method addMethod=classType.getMethod("add",new Class[]{int.class,int.class});
    Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。
     
    在本例中,尽管InvokeTester 类的add()方法的两个参数以及返回值都是int类型,调用add Method 对象的invoke()方法时,只能传递Integer 类型的参数,并且invoke()方法的返回类型也是Integer 类型,Integer 类是int 基本类型的包装类:
     
    Object result=addMethod.invoke(invokeTester,
    new Object[]{new Integer(100),new Integer(200)});
    System.out.println((Integer)result); //result 为Integer类型
     
     
    博客搬家了。本文新地址:http://www.zicheng.net/article/3
  • 相关阅读:
    JS/JQuery获取当前元素的上一个/下一个兄弟级元素等元素的方法
    目前流行前端几大UI框架
    C#客户端嵌入Chrome浏览器的实现
    ARM编译中的RO、RW和ZI DATA区段
    如何成为优秀的技术Leader?做到这三点就够了
    VMware虚拟机中的CentOS安装Nginx后本机无法访问的解决办法
    Centos下安装nginx步骤解析
    centos修改、保存文件的详细步骤
    configure: error: C preprocessor "arm-linux-gnueabihf-g++" fails sanity check
    有关fgetc配合feof逐行读取文件最后一行读取两遍的错觉?
  • 原文地址:https://www.cnblogs.com/xusir/p/4308174.html
Copyright © 2011-2022 走看看