java反射方法调用_Java反射(3)调用方法
目录:
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)调用方法相关推荐
- java反射调用接口方法参数_Java反射调用某个类的方法(带参数和不带参数)
不多说,直接贴代码,不懂查API,现在就列取要用的方法和类. Class类: public Method getDeclaredMethod(String name, Class>... par ...
- java 反射 获取方法列表_Java 反射获取类详细信息的常用方法汇总
为了加深印象,特把方法都从新敲了一遍,等不会的时候返回了看看就好了. 类ReflectionDemo package Reflection; @Deprecated public class Refl ...
- java反射 获取属性_Java反射学习-3 - 反射获取属性,方法,构造器
1 packagecn.tx.reflect;2 3 importjava.lang.reflect.Constructor;4 importjava.lang.reflect.Field;5 imp ...
- java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点
关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...
- java class 生成对象_Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.refl ...
- java反射的运用_java反射的使用
java反射的使用 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- java技术详解_Java反射技术详解及实例解析
前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...
- java反射随意值_Java反射笔记
Java反射 反射库提供了一个丰富且精巧的工具集,可以用来编写能够动态操纵Java代码的程序.能够分析类能力的程序称为反射(reflective).反射机制的功能极为强大,反射机制可以用来: 在运行时 ...
- java privilege的用法_java反射--注解的定义与运用以及权限拦截
自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...
最新文章
- python中不同进制的整数之间可以直接运算_Python 进制转换、位运算
- Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource c
- win10下装win7双系统_3步安装电脑双系统,win7+win10自由选择进入,你学会了吗?...
- 变种 背包问题_【朝夕的ACM笔记】动态规划-背包问题
- extjs 表单验证实例
- 渗透测试入门5之内网信息搜集
- python定时器 是线程吗_定时器中断线程python
- js作为参数,并且返回值;js的回调模式 callback
- mysql的三种安装方式(详细)
- weblogic 下载地址
- tpadmin隐藏index.php,百度云服务器tp5框架布署,隐藏路径中的index.php
- [HNOI2009] 图的同构
- Linux解决Device eth0 does not seem to be present,delaying initialization问题
- 2005高考作文题目汇总
- gabor特征 gabor滤波器
- 阿里云官网购买云服务器完整版流程(图文教程)
- OpenMP与MPI
- 你的香腮边轻轻滑落的, 是你的泪,还是我的泪。
- 浏览器中显示PPT的展示效果
- web开发浏览器缓存问题之Google浏览器缓存清理
热门文章
- 近两万字 TCP 硬核知识,教你吊打面试官!
- 天呐,你竟然还在用 try–catch-finally
- 编译器说 Lambda 表达式中的变量必须是 final 的,我偏不信 | 原力计划
- 一招生成定制版二次元人脸头像,还能“模仿”你的表情!
- 任正非称华为 6G 领先世界;支付宝小程序将与微博打通;Linux Kernel 5.3 发布 | 极客头条...
- Java 8 终于支持 Docker !
- Unity 和腾讯游戏成立联合创新实验室:从技术创新探索游戏产品新模式和概念
- 惠普往事:全球最大的 PC 制造商炼成记!| 极客头条
- 仅用语音,AI 就能“脑补”你的脸! | 技术头条
- 雷军牵手李嘉诚;董明珠被“排挤”;余额宝限购终结| CSDN极客头条