Java反射之成员方法的反射
上一篇介绍了Java反射之成员变量的反射,这次介绍成员方法的反射。
[一]Method类
Method类中封装了所有java方法的属性,包括该方法是否私有,该方法的修饰符,返回值,参数,抛的错误等等。
为了能判断是否私有,Method也继承了java.lang.reflect.AccessibleObject。
下面演示如何使用反射调用String类中charAt()方法
public static void main(String[] args) throws Exception {
String str = new String("leyvan");
Class cls = Class.forName("java.lang.String");
//得到名字叫charAt的方法,charAt参数的类型是int.class
Method method = cls.getMethod("charAt", int.class);
//str.charAt(1);
System.out.println(method.invoke(str, 1));
}
结果:
e
Class类的getMethod(String methodName,Class parameterType)方法:根据参数-方法名和参数类型个数获得相应的方法。
Method类的方法invoke(Object,Object):绑定一个执行该方法的对象,并为该方法传入一个参数调用该方法。
Class类中还有getDeclaredMethod:获得所有方法,包括私有的方法。
Method调用私有方法和Field调用私有成员一样,详细请看上一篇文章。
[二] 案例:模仿main方法,给main方法传入一个数组参数
已知某个类中已存在main方法,通过反射调用该类中的main方法,并未方法传入一个String[] args。
辅助类:
package club.leyvan.muzile;
public class GeneralClass {
public void main(String [] args){
for(String str : args){
System.out.println(str);
}
}
}
测试方法:先演示一个错误
public static void main(String[] args) throws Exception {
String[] className = new String[]{"club.leyvan.muzile.GeneralClass"};
//获得该类的Class
Class cls = Class.forName(className[0]);
//创建对象
Object obj = cls.newInstance();
//获得名为main的方法
Method main = cls.getMethod("main", String[].class);
//准备参数
String[] parameters = new String[]{"muzile","leyvan","www.leyvan.club"};
//调用方法
main.invoke(obj, parameters);
}
结果:
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
这里错误的原因是invoke第二个参数接收的是一个Object[]数组而Parameters是一个String的数组,但是getMethod方法中的类型要和invoke方法中的类型一致,而jdk1.4和1.5中invoke方法是不同的,因为1.5引入了可变参数,当传入不是Object数组时就会自动与1.5的方法对应,从而接受一个Object可变参数,而这里把String[]看作为一个参数,且与参数不符。
修改代码后:
public static void main(String[] args) throws Exception {
String[] className = new String[]{"club.leyvan.muzile.GeneralClass"};
//获得该类的Class
Class cls = Class.forName(className[0]);
//创建对象
Object obj = cls.newInstance();
//获得名为main的方法
Method main = cls.getMethod("main", String[].class);
//准备参数
String[] parameters = new String[]{"muzile","leyvan","www.leyvan.club"};
//调用方法
//第一种修改方式:
//main.invoke(obj, new Object[]{parameters});
//第二中修改方式
main.invoke(obj, (Object)parameters);
}
结果:
muzile
leyvan
www.leyvan.club
这里可以将parameters看作一个参数包装在Object数组中,还可以将String[]强制类型转换,变成三个参数,对应1.5以后的可变长度参数。
[三] 数组与Object及其反射类型
我们看一下下面的代码:
public static void main(String[] args) throws Exception {
int[] a1 = new int[]{1,2,3};
int[][] a2 = new int[][]{{1,2},{1,3}};
String[] s = new String[]{"a","b","c"};
System.out.println(Arrays.asList(a1));
System.out.println(Arrays.asList(a2));
System.out.println(Arrays.asList(s));
}
结果:
[[I@100363]
[[I@14e8cee, [I@67064]
[a, b, c]
从上面我们可以发现,a1和a2都只封装了个地址,并没有把值加入到list
这是因为,基础类型数组的父类型都是Object,基础类型的数组父类型就是Object的一维数组,所以传入asList时,被基础类型的一维数组背叛定为Object,作为一位可变参数传入方法中,所以就将object封装成数组了。
下一章:Java反射之数组的反射应用
Java反射之成员方法的反射的更多相关文章
- Java反射之数组的反射应用
上一篇我们说了Java反射之成员方法的反射 这一篇我们说一说数组的反射应用,数组的有长度等属性,所以也会有相应的方法获得这些属性,这里我们不一一列举哪些方法.我们来了解反射包中的一个类----Arra ...
- Java学习笔记54(反射详解)
反射概念: java反射机制是在运行状态中,对于任意一个类,都能知道所有属性和方法 对于任意一个对象都能调用它的任意一个方法和属性,这种动态获取和调用的功能称为java的反射机制 实际作用: 已经完成 ...
- JAVA中的糕富帅技术——反射(一)
前言 突然发现好久没写博客了,前面写的都是关于Android的东西,今天心血来潮突然有一种冲动想写一篇基于JAVA技术的博客,别问我为什么?有钱.任性! 今天就来谈谈反射机制:学过JAVA的人不一定懂 ...
- java基础篇3之反射
1.反射的基础 反射的基石---->Class类 java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class 获取字节码对应的实例对象(Class类型) class ...
- java基础(32):类加载、反射
1. 类加载器 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 就是指将class文件读入内存,并为之创建一个C ...
- Java内功修炼系列一反射
“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制 ...
- java基础第12期——反射、注解
一. 反射 反射: 将类的各个组成部分封装为其他对象. 1.1 获取class对象的方式 Class.forName("全类名"): 将字节码文件加载进内存,返回class对象 多 ...
- Java 反射(一)反射简介、原理和应用场景
目录 一.动态语言和动态语言的比较 动态语言 静态语言 二.反射 简介 反射的常见使用 1. 代码编辑器 2. Spring等框架的IoC容器 3. 和注解的配合使用 原理 反射优缺点 调试查看 Cl ...
- Java安全第一篇 | 反射看这一篇就够了
什么是反射? Java安全可以从反序列化漏洞说起,反序列化漏洞又可以从反射说起.反射是⼤多数语⾔⾥都必不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可 ...
随机推荐
- 学会使用数据讲故事——Excel研究网络研讨会
编者按:在数据密集型研究的新时代,Excel将成为研究者讲故事的强大工具.在即将举行的Excel研究网络研讨会中,我们将与你探讨如何用新的方式来寻找.查询.分析数据并实现数据可视化.Office 36 ...
- python学习笔记(8)迭代器和生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- JSP_EL的回顾
在 JSP 页面中,使用标签库代替传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现.鉴于此,出现了 JSTL ( JSP Standa ...
- HDU1233 还是畅通工程
题目: Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连 ...
- IOS下的safari下localStorage不起作用的问题
我们的一个小应用,使用百度地图API获取到用户的坐标之后用localStorage做了下缓存,测试上线之后有运营同学反馈页面数据拉取不到, 测试的时候没有发现问题,而且2台相同的iphone一台可以一 ...
- Django中加载static无法成功的解决方法
我试着进入/admin/ 结果它的/static/ 能够正常找到目标文件…真是日了哈*奇了. 我的link标签href=/static/…. 并没有什么问题 试着在urls中加入下面代码,但是没什么用 ...
- springboot oauth 鉴权之——授权码authorization_code鉴权
近期一直在研究鉴权方面的各种案例,这几天有空,写一波总结及经验. 第一步:什么是 OAuth鉴权 OAuth2是工业标准的授权协议.OAuth2取代了在2006创建的原始OAuthTM协议所做的工作. ...
- 漫说测试 | 研发虐我千百遍,我待bug如初恋
的行业之一他们的运筹帷幄,他们的勾心斗角,只有自己知道.000,但绝对也是最枯燥的行业之一! IT可能是几个最高薪行业之一,但同时也绝对是最辛苦的行业之一!IT业是最需要创新能力的行业之一,但绝对也是 ...
- Jennifer Chayes: 生活始终在你手中
Jennifer Chayes 听到Mark Kac.Freeman J. Dyson.林家翘,或者是David I. Gottlie.BerndSturmfels和Sir John Ball等 ...
- Python的Flask框架开发RESTful API
web框架选择 Django,流行但是笨重,还麻烦,人生苦短,肯定不选 web.py,轻量,但据说作者仙逝无人维护,好吧,先pass tornado,据说倡导自己造轮子,虽然是facebook开源的吧 ...