目录:

1.访问方法(Method)对象的方法汇总

2.获取方法(Method)对象中的值

3.设置方法(Method)对象中的值

1.访问Method的方法汇总

以下四种方法在Class类可以返回关于字段的 Method 对象。

Method getMethod(name, Class...):获取某个public的Method(包括父类)

Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)

Method[] getMethods():获取所有public的Method(包括父类)

Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)

使用示例:

public class Main {

public static void main(String[] args) throws Exception {

Class stdClass = Student.class;

// 获取public方法getScore,参数为String:

System.out.println(stdClass.getMethod("getScore", String.class));

// 获取继承的public方法getName,无参数:

System.out.println(stdClass.getMethod("getName"));

// 获取private方法getGrade,参数为int:

System.out.println(stdClass.getDeclaredMethod("getGrade", int.class));

}

}

class Student extends Person {

public int getScore(String type) {

return 99;

}

private int getGrade(int year) {

return 1;

}

}

class Person {

public String getName() {

return "Person";

}

}

输出信息如下:

public int Student.getScore(java.lang.String)

public java.lang.String Person.getName()

private int Student.getGrade(int)

一个Method对象包含一个方法的所有信息:

getName():返回方法名称,例如:"getScore";

getReturnType():返回方法返回值类型,也是一个Class实例,例如:String.class;

getParameterTypes():返回方法的参数类型,是一个Class数组,例如:{String.class, int.class};

getModifiers():返回方法的修饰符,它是一个int,不同的bit表示不同的含义。

2.调用public的非静态方法

import java.lang.reflect.Method;

public class MethodMain {

public static void main(String[] args) throws Exception {

//1.采用传统方法访问substring()方法

String str1 = "Hello world1";

String res1 = str1.substring(6); // "world1"

System.out.println(res1);

// 2.采用反射访问substring()方法

String str2 = "Hello world2";

// 获取public String substring(int beginIndex) 方法,参数为int类型:

Method method = String.class.getMethod("substring", int.class);//这里需要传入int.class即参数的Class类

// 在s对象上调用该方法并获取结果:

String res2 = (String) method.invoke(str2, 6);//invoke(Object obj, Object... args)

// 打印调用结果:

System.out.println(res2);//"world2"

}

}

注意到substring()有两个重载方法,我们获取的是String substring(int)这个方法。

对Method实例调用invoke就相当于调用该方法,invoke的第一个参数是对象实例,即在哪个实例上调用该方法,后面的可变参数要与方法参数一致,否则将报错。

3.调用非public的非静态方法

public class Main {

public static void main(String[] args) throws Exception {

Person p = new Person();

Method m = p.getClass().getDeclaredMethod("setName", String.class);

m.setAccessible(true);//访问非public方法,需要在这里设置一下,否则会报错IllegalAccessException

m.invoke(p, "Bob");

System.out.println(p.name);

}

}

class Person {

String name;

private void setName(String name) {

this.name = name;

}

}

4.访问静态方法

public class Main {

public static void main(String[] args) throws Exception {

// 获取Integer.parseInt(String)方法,参数为String:

Method m = Integer.class.getMethod("parseInt", String.class);

// 调用该静态方法并获取结果:

Integer n = (Integer) m.invoke(null, "12345");//如果获取到的Method表示一个静态方法,调用静态方法时,由于无需指定实例对象,所以invoke方法传入的第一个参数永远为null。我们以Integer.parseInt(String)为例:

// 打印调用结果:

System.out.println(n);

}

}

5.多态方法的调用

假设:一个Person类定义了hello()方法,并且它的子类Student也覆写了hello()方法,那么,从Person.class获取的Method,作用于Student实例时,调用的方法到底是哪个?

public class Main {

public static void main(String[] args) throws Exception {

// 获取Person的hello方法:

Method h = Person.class.getMethod("hello");

// 对Student实例调用hello方法:

h.invoke(new Student());//输出:Student:hello

}

}

class Person {

public void hello() {

System.out.println("Person:hello");

}

}

class Student extends Person {

public void hello() {

System.out.println("Student:hello");

}

}

运行上述代码,发现打印出的是Student:hello,因此,使用反射调用方法时,仍然遵循多态原则:即总是调用实际类型的覆写方法(如果存在)。

反射代码:

Method m = Person.class.getMethod("hello");

m.invoke(new Student());

相当于:

Person p = new Student();

p.hello();//多态

java反射方法调用_Java反射(3)调用方法相关推荐

  1. java反射调用接口方法参数_Java反射调用某个类的方法(带参数和不带参数)

    不多说,直接贴代码,不懂查API,现在就列取要用的方法和类. Class类: public Method getDeclaredMethod(String name, Class>... par ...

  2. java 反射 获取方法列表_Java 反射获取类详细信息的常用方法汇总

    为了加深印象,特把方法都从新敲了一遍,等不会的时候返回了看看就好了. 类ReflectionDemo package Reflection; @Deprecated public class Refl ...

  3. java反射 获取属性_Java反射学习-3 - 反射获取属性,方法,构造器

    1 packagecn.tx.reflect;2 3 importjava.lang.reflect.Constructor;4 importjava.lang.reflect.Field;5 imp ...

  4. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

    关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...

  5. java class 生成对象_Java反射机制(创建Class对象的三种方式)

    1:SUN提供的反射机制的类: java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.refl ...

  6. java反射的运用_java反射的使用

    java反射的使用 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  7. java技术详解_Java反射技术详解及实例解析

    前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...

  8. java反射随意值_Java反射笔记

    Java反射 反射库提供了一个丰富且精巧的工具集,可以用来编写能够动态操纵Java代码的程序.能够分析类能力的程序称为反射(reflective).反射机制的功能极为强大,反射机制可以用来: 在运行时 ...

  9. java privilege的用法_java反射--注解的定义与运用以及权限拦截

    自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...

最新文章

  1. python中不同进制的整数之间可以直接运算_Python 进制转换、位运算
  2. Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource c
  3. win10下装win7双系统_3步安装电脑双系统,win7+win10自由选择进入,你学会了吗?...
  4. 变种 背包问题_【朝夕的ACM笔记】动态规划-背包问题
  5. extjs 表单验证实例
  6. 渗透测试入门5之内网信息搜集
  7. python定时器 是线程吗_定时器中断线程python
  8. js作为参数,并且返回值;js的回调模式 callback
  9. mysql的三种安装方式(详细)
  10. weblogic 下载地址
  11. tpadmin隐藏index.php,百度云服务器tp5框架布署,隐藏路径中的index.php
  12. [HNOI2009] 图的同构
  13. Linux解决Device eth0 does not seem to be present,delaying initialization问题
  14. 2005高考作文题目汇总
  15. gabor特征 gabor滤波器
  16. 阿里云官网购买云服务器完整版流程(图文教程)
  17. OpenMP与MPI
  18. 你的香腮边轻轻滑落的, 是你的泪,还是我的泪。
  19. 浏览器中显示PPT的展示效果
  20. web开发浏览器缓存问题之Google浏览器缓存清理

热门文章

  1. 近两万字 TCP 硬核知识,教你吊打面试官!
  2. 天呐,你竟然还在用 try–catch-finally
  3. 编译器说 Lambda 表达式中的变量必须是 final 的,我偏不信 | 原力计划
  4. 一招生成定制版二次元人脸头像,还能“模仿”你的表情!
  5. 任正非称华为 6G 领先世界;支付宝小程序将与微博打通;Linux Kernel 5.3 发布 | 极客头条...
  6. Java 8 终于支持 Docker !
  7. Unity 和腾讯游戏成立联合创新实验室:从技术创新探索游戏产品新模式和概念
  8. 惠普往事:全球最大的 PC 制造商炼成记!| 极客头条
  9. 仅用语音,AI 就能“脑补”你的脸! | 技术头条
  10. 雷军牵手李嘉诚;董明珠被“排挤”;余额宝限购终结| CSDN极客头条