正常来说,我们调用对象的方法是通过dot运算符来进行的,这里我们介绍另一种方法,有以下几个步骤:1,获取该类的Class Type;2,通过getMethod方法获取Method对象;3,通过调用invoke方法来执行对象的某个方法;这里要特别注意下getMethod方法和invoke方法的参数,见下面的例子

 package reflectTest;

 import java.lang.reflect.Method;

 /**
  * 通过获取类类型,进而获取Method对象,进而调用类的方法,
  * 和直接通过类的对象来调用方法可以达到一样的效果,这里的示例调用了对象的三个方法
  * @author Wang
  *
  */
 public class MethodDemo1 {
     public static void main(String[] args) {

         // 1.要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型,要获取print(int ,int )方法
         A a1 = new A();
         Class c = a1.getClass();

         // 2.获取方法 名称和参数列表来决定 getMethod获取的是public的方法 getDelcaredMethod自己声明的方法
         try {
             System.out.println("==================调用print(int a, int b)方法");
             // Method m = c.getMethod("print", new Class[]{int.class,int.class});
             Method m = c.getMethod("print", int.class, int.class);
             // 方法的反射操作
             // a1.print(10, 20);方法的反射操作是用m对象来进行方法调用 和a1.print调用的效果完全相同
             // 方法如果没有返回值返回null,有返回值返回具体的返回值
             // Object o = m.invoke(a1,new Object[]{10,20});
             Object o = m.invoke(a1, 10, 20);

             System.out.println("==================调用print(String a, String b)方法");

             // 获取方法print(String,String)
             Method m1 = c.getMethod("print", String.class, String.class);
             // 用方法进行反射操作
             // a1.print("hello", "WORLD");
             o = m1.invoke(a1, "hello", "WORLD");

             System.out.println("===================调用无参的print方法");

             // Method m2 = c.getMethod("print", new Class[]{});
             Method m2 = c.getMethod("print");
             // m2.invoke(a1, new Object[]{});
             m2.invoke(a1);

         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }

     }
 }

 class A {
     public void print() {
         System.out.println("helloworld");
     }

     public void print(int a, int b) {
         System.out.println(a + b);
     }

     public void print(String a, String b) {
         System.out.println(a.toUpperCase() + "," + b.toLowerCase());
     }
 }

Java中Method.invoke方法,反射?的更多相关文章

  1. java中Method.invoke方法参数解析

    通过发射的机制,可以通过invoke方法来调用类的函数.invoke函数的第一个参数是调用该方法的实例,如果该方法是静态方法,那么可以用null或者用类来代替,第二个参数是变长的,是调用该方法的参数. ...

  2. 【java】method.invoke(方法底层所属对象/null,new Object[]{实际参数})

    反射调方法时无论是静态/非静态,固定/可变参数,都有Object对象数组对参数进行包装. package com.tn.clas; import java.lang.reflect.Method; i ...

  3. (转)Java.lang.reflect.Method invoke方法 实例

    背景:今天在项目中用到Method 的invoke方法,但是并不理解,查完才知道,原来如此! import java.lang.reflect.Method; /** * Java.lang.refl ...

  4. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  5. java中的compareto方法的详细介绍

    java中的compareto方法的详细介绍 Java Comparator接口实例讲解(抽象方法.常用静态/默认方法) 一.java中的compareto方法 1.返回参与比较的前后两个字符串的as ...

  6. 浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  7. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  8. JAVA中的finalize()方法

    [转]JAVA中的finalize()方法 今天早上看Thinking in java的[第四章 初始化和清除].[  清除:终结和垃圾回收]的时候, 看到了这个东西. 用于清理滴... 当然,这个方 ...

  9. Java中的native方法

    博客引用地址:Java中的native方法 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地 ...

随机推荐

  1. 分享知识-快乐自己:Liunx—Maven 部署步骤

    第一步: 点我下载 Liunx—Maven Linux命令下载:wget [下载文件存放路径]   [下载文件地址] 第二步: 上传 Maven 并解压到 指定的目录:(上传方式 xftp 或 rz ...

  2. hdu 2041 超级楼梯(简单dp)

    超级楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. 08 - Django应用第五步

    1 自动测试 自动测试与测试的不同在于, 自动测试的测试工作是交给系统完成的 测试也有分类和级别, 有的用于一些细微的细节, 有的是针对整个软件整体 测试会保证一些看起来正常运行的功能在实际的多种情况 ...

  4. linux命令学习笔记( 7 ) : mv 命令

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令, 经常用来备份文件或者目录. .命令格式: mv [选项] 源文件或目 ...

  5. HTML5视音频标签参考

    本文将介绍HTML5中的视音频标签和对应的DOM对象.是相关资料的中文化版本,可以作为编写相关应用的简易中文参考手册. 一些约定 所有浏览器:指支持HTML5的常见桌面浏览器,包括IE9+.Firef ...

  6. Tensorflow 数据导入

    导入数据 借助 tf.data API,您可以根据简单的可重用片段构建复杂的输入管道.例如,图片模型的管道可能会汇聚分布式文件系统中的文件中的数据.对每个图片应用随机扰动,并将随机选择的图片合并成用于 ...

  7. Parallel Programming-Paralle.For && ForEach

    本文主要介绍Parallel.For以及Parallel.ForEach.Parallel.For是普通步长为1的for循环的并行代替方案.Parallel.ForEach是以集合为基准进行循环的fo ...

  8. spring初始化顺序

    首先,Spring bean的默认加载顺序是怎么控制的 工程中有2个bean,A和B,其中必须先初始化A再初始化B,但是没有depend-on或者Order等方式去保证,只不过恰好刚好这么运行着没出事 ...

  9. Python模块-subprocess模块

    Run()方法 >>> a = subprocess.run(['df','-h']) 文件系统 容量 已用 可用 已用% 挂载点 udev 468M 0 468M 0% /dev ...

  10. Sql server 备份及还原

    --最常用的几种备份方法: --数据备份----------------------- --数据库级:完整数据库备份 差异数据库备份 --文件级: 完整文件备份 差异文件备份 --日志备份------ ...