本文接上文“获取类的信息”,利用反射(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. loj2497 [PA2017]Banany(动态淀粉质)

    link 给定一棵树,点有点权,边有边权,你每次修改一个点点权或者是修改一个边边权 你一开始在1号点,你每次改节点之后你需要移动到另一个节点,满足这个节点权值减去路径长度最大(下一次从这个节点移动)如 ...

  2. pip安装本地文件

    I do a lot of development without an internet connection1, so being able to install packages into a ...

  3. python的builtins模块

    builtins模块详解 1.简介 builtins是python的内建模块,所谓内建模块就是你在使用时不需要import,在python启 动后,在没有执行程序员编写的任何代码前,python会加载 ...

  4. C#集合之可观察的集合

    如果需要集合中的元素何时删除或添加的信息,可以使用ObservableCollection<T>类.这个类是为WPF定义的,这样UI就可以得知集合的变化.这个类在程序集WindowsBas ...

  5. apache的应用(发布目录,黑白名单,虚拟主机,PHP-cgi支持,正向代理,https加密,)

    [root@apache1 ~]# yum install httpd -y [root@apache1 ~]# cd /var/www/html/   进入默认发布目录 [root@apache1 ...

  6. Storm个人学习总结

    https://www.jianshu.com/p/c7fba7d6a24d https://www.cnblogs.com/peak-c/p/6297794.html https://blog.cs ...

  7. wiz笔记

    分享本地的wiz笔记到网上 , 成为博客 博客园 http://www.cnblogs.com/您的博客名称/services/metablogapi.aspx // region 图片里面的字段:从 ...

  8. 3dsmax2014卸载/安装失败/如何彻底卸载清除干净3dsmax2014注册表和文件的方法

    3dsmax2014提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dsmax2014失败提示3dsmax2014安装未完成,某些产品无法安装,也有时候想重新 ...

  9. 关于sql通配符检索问题-【.NET】

    确定给定的字符串是否与指定的模式匹配.模式可以包含常规字符和通配符字符.模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配.然而,可使用字符串的任意片段匹配通配符.与使用 = 和 != 字符串比 ...

  10. clearfix的用法

    如果有一个DIV作为外部容器,内部的DIV如果设置了float样式,则外部的容器DIV因为内部没有 clear,导致不能被撑开.看下面的例子:Div布局如下:Css代码如下:.out{border:1 ...