本文接上文“获取类的信息”,利用反射(invoke)来获取一个类中的方法来执行。

1、定义一个类,包含三个名称相同,参数不同的方法

 class A{
public void print(){
System.out.println("Hello,World");
} 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());
}
}

2、利用方法的反射(invoke)分别获取该类三个方法并执行

 public class Test {
public static void main(String[] args) {
/**
* 获取print(int,int)方法
* 1、获取类的类类型
*/
A a1 = new A();
Class clazz = a1.getClass();
/**
* 2、获取方法(名称、参数列表)
* getMethod()获取的是public方法
* getDeclaredMethod()获取的是自己声明的方法
*/
try {
// Method m = clazz.getMethod("print",new Class[]{int.class,int.class});
Method m = clazz.getMethod("print", int.class, int.class);
//方法的反射操作,用m对象进行方法调用,a1.print完全相同
//方法没有返回值返回null,有返回值返回具体的返回值
// Object obj = m.invoke(a1,new Object[]{10,20});
Object obj = m.invoke(a1,10,20); System.out.println("================================================"); Method m2 = clazz.getMethod("print", String.class, String.class);
m2.invoke(a1,"aaa","BBB"); System.out.println("================================================"); Method m3 = clazz.getMethod("print");
m3.invoke(a1);
} catch (Exception e) {
e.printStackTrace();
}
}
}

3、完整代码

 package com.format.test;

 import java.lang.reflect.Method;

 /**
* Created by Format on 2017/6/3.
*/
public class Test {
public static void main(String[] args) {
/**
* 获取print(int,int)方法
* 1、获取类的类类型
*/
A a1 = new A();
Class clazz = a1.getClass();
/**
* 2、获取方法(名称、参数列表)
* getMethod()获取的是public方法
* getDeclaredMethod()获取的是自己声明的方法
*/
try {
// Method m = clazz.getMethod("print",new Class[]{int.class,int.class});
Method m = clazz.getMethod("print", int.class, int.class);
//方法的反射操作,用m对象进行方法调用,a1.print完全相同
//方法没有返回值返回null,有返回值返回具体的返回值
// Object obj = m.invoke(a1,new Object[]{10,20});
Object obj = m.invoke(a1,10,20); System.out.println("================================================"); Method m2 = clazz.getMethod("print", String.class, String.class);
m2.invoke(a1,"aaa","BBB"); System.out.println("================================================"); Method m3 = clazz.getMethod("print");
m3.invoke(a1);
} catch (Exception e) {
e.printStackTrace();
}
}
} class A{
public void print(){
System.out.println("Hello,World");
} 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());
}
}

4、执行结果

[Java反射基础三]方法反射的基本操作的更多相关文章

  1. java 编程基础 Class对象 反射 :获取类的构造方法,方法,成员变量,内部类,外部类,父类,实现的接口,修饰符等...

    类 Class  每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类. 我们在Java中获取Class对象一般有三种方式: (1), 使用C ...

  2. [Java反射基础四]通过反射了解集合泛型的本质

    本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...

  3. JAVA基金会 (三)反射 反思的深度分析

    上一页已经推出反映的一些基本概念,这主要是通过一个例子反映谈的过程,以及样品的实际应用. 这个样例是这种设计思路:从一个属性文件里读取一段字符串,然后,依据该字符串生成相应的类实例对象:这之后另一个增 ...

  4. java 编程基础 Class对象 反射 :参数反射

    方法参数反射 Java8在java.lang.reflect包下新增了Executable抽象基类,该对象代表可执行的类成员,该类派生了Constructor和Method两个子类.Executabl ...

  5. java 编程基础 Class对象 反射:动态代理 和AOP:java.lang.reflect.Proxy:(Proxy.newProxyInstance(newProxyInstance​(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h))

    为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦.   Proxy类的使用规则 Proxy提 ...

  6. java 编程基础 Class对象 反射 :数组操作java.lang.reflect.Array类

    java.lang.reflect包下还提供了Array类 java.lang.reflect包下还提供了Array类,Array对象可以代表所有的数组.程序可以通过使 Array 来动态地创建数组, ...

  7. java 编程基础 Class对象 反射:代理模式和静态代理

    生活中的代理 类(对象)代理模式 代理模式是面向对象编程中比较常见的设计模式. 1. 用户只关心接口功能,而不在乎谁提供了功能.上图中接口是 Subject 2. 接口真正实现者是上图的 RealSu ...

  8. Java语言基础之方法的设计

    开发遵循原则之一: DRY原则:Don't Repeat Yourself(不要重复你自己的代码) 原因:重复意味着维护成本的增大 public static void main(String[] a ...

  9. java面向对象基础(三):对象转型和多态

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

随机推荐

  1. jquery源码解析:pushStack,end,ready,eq详解

    上一篇主要讲解了jQuery原型中最重要的方法init.接下来再讲一些比较常用的原型方法和属性 core_slice = [].slice, jQuery.fn = jQuery.prototype ...

  2. 用JS实现汉字转拼音

    <!DOCTYPE HTML> <html> <head> <title>用JS实现汉字转拼音</title> <meta chars ...

  3. jupyter notebook 的安装及使用

    推荐使用Python3 版本 安装pip3 版本 打开终端输入,安装jupyter notebook(ipython4之后命名) pip3 install jupyter notebook 启动jup ...

  4. scrollto 到指定位置

    goTo = function(target){ var scrollT = document.body.scrollTop|| document.documentElement.scrollTop ...

  5. 为什么int类型的数据可以存储超过9999?

    int占4字节,4*8=32位,10进制取值范围为 (-2^31-1)~(2^31-1):-2147483648~2147483647 package test; public class test1 ...

  6. Ubuntu16.04装机后处理

    1.卸载软件 #卸载libreOffice sudo apt remove libreoffice-common #卸载amazon sudo apt remove unity-webapps-com ...

  7. Kettle导入数据到Hive 出现多余的几行全部是null值的情况

    Kylin构建Cube的时候老是报错,说是有空值,其实源数据中是不存在空值的.为什么建Cube的时候会有呢? 执行完毕后使用Hive查询发现多了好几行全部是null的行. 这在源数据中是不存在的.分析 ...

  8. 干掉Vivado幺蛾子(1)-- Xilinx Tcl Store

    目录 1. 安装Xilinx Tcl Store 2. 手动更新 2.1 下载库 2.2 修改环境变量 参考文献: 最近在跟着高亚军老师的分析文章来学习Xilinx最近发布的<UltraFast ...

  9. python脚本中appium的自启动自关闭

    前提:已安装appium命令行版本 将appium的启动及其关闭直接写在脚本中,运行起来会方便很多 创建startAppiumServer.bat 和 stopAppiumServer.bat文件,然 ...

  10. mybatis的CRUD实例(三)

    前面的文章我们已经实现了根据id查询用户信息的功能,下面我们进行其他业务功能的实现. 一.根据用户名模糊查询用户列表 查询使用的sql : select * from user where usern ...