对于反射中的invoke()方法的理解
先讲一下java中的反射:
反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作
在比较复杂的程序或框架中来使用反射技术,可以简化代码提高程序的复用性。
讲的是Method类的invoke()方法。
既然是讲invoke方法,那就不讲怎么使用反射了,代码上来先:
package online; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import org.junit.Test; public class Msym { public void test(String[] arg){
for (String string : arg) {
System.out.println(string);
}
}
@Test
public void demo1() throws Exception {
//获取字节码对象
Class<Msym> clazz = (Class<Msym>) Class.forName("online.Msym");
//获取一个对象
Constructor con = clazz.getConstructor();
Msym m = (Msym) con.newInstance();
String[] s = new String[]{"aa","bb"};
//获取Method对象
Method method = clazz.getMethod("test", String[].class);
//调用invoke方法来调用
method.invoke(m, s);
}
}
测试会报错:

红色框框显示是参数错误,test方法需要是字符串数组啊,我传递也是字符串数组,怎么就不对了??
让我们来看一下invoke方法:

invoke方法的参数,一个是Object类型,也就是调用该方法的对象,
第二个参数是一个可变参数类型,这个可变参数类型怎么能传递给一个数组类型呢?一个是多个参数。一个是一个数组参数,显然参数的个数不匹配,怎么解决呢?
解决办法就是将可变参数变成一个参数:
- 将传递进去的s强转为Object类型
- 将s重新包装成一个Object数组
测试一下:

结果可行。
对于反射中的invoke()方法的理解的更多相关文章
- 对于自定义标签类中JspBody类的invoke方法的理解
下面是javaeeAPI中对于invoke()方法的介绍: 其中的参数out是一个Writer类的对象,如果写null,就是将标签体内容写到了与此jsp相关联的JspWriter对象,也就是下面的w: ...
- Java反射中的getClass()方法
Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代 ...
- java反射中Method类invoke方法的使用方法
package com.zsw.test; import java.lang.reflect.Method;import java.lang.reflect.InvocationTargetExcep ...
- JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别 关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来 ...
- 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用
反射的概念 反射: Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活 ...
- 从Mybatis源码理解jdk动态代理默认调用invoke方法
一.背景最近在工作之余,把开mybatis的源码看了下,决定自己手写个简单版的.实现核心的功能即可.写完之后,执行了一下,正巧在mybatis对Mapper接口的动态代理这个核心代码这边发现一个问题. ...
- 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型
C#反射中的MakeGenericType函数可以用来指定泛型方法和泛型类的具体类型,方法如下面代码所示这里就不多讲了,详情看下面代码一切就清楚了: using System; using Syste ...
- JAVA深入研究——Method的Invoke方法。
在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...
- 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)
反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法) 创建Delegate (1).Delegate.CreateDelegate(Type, ...
随机推荐
- MySQL插入数据中文乱码问题的解决
一.使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集. 1.启动cmd,登录mysql ①cd C:\Program Files\MySQL\ ...
- Python - Python2与Python3合理共存Windows平台
Install Python2 and Python3 Python 2.7.13 - Windows x86-64 MSI installer Python 3.6.0 - Windows x86- ...
- java 多线程之卖票两种方式
1.通过extends Thread /* 需求:简单的卖票,多个窗口同时买票 (共用资源) 创建线程的第二种方式:实现Runnable接口 步骤: 1,定义类实现Runnable接口 2,覆盖/重写 ...
- Xamarin+Prism开发详解八:自动化测试之NUnit实践
自动化测试很重要!很重要!以前多是手动测试,没有写过测试用例.这样的结果就是发现bug改了之后关联的其他功能又要从新测一遍.这样既浪费时间与成本,而且很无聊.之所以选择NUnit是公司需要,现在.ne ...
- JAVA 命令行参数解析,org.apache.commons.cli的使用
maven依赖引入 <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cl ...
- 理解InnoDB的事务隔离级别
隔离是ACID(Atomicity,Consistency,Isolation,Durability)的重要部分,它保证事务以一种可靠的方式运行.隔离确保同时运行的事务并不相互干扰.隔离确保数据一致性 ...
- oracle 随笔
oracle分页 select * from (select a1.*, rownum rn from (select *from emp) a1 where rownum<=10) where ...
- javascript小测试
测试地址:http://toys.usvsth3m.com/javascript-under-pressure/ 在群里看到测试网站做着玩,希望你能过关,不能,且看下面答案(为了过关,不惜不够严谨) ...
- Python字典详解
转载请注明出处 Python字典(dict)是一个很常用的复合类型,其它常用符合类型有:数组(array).元组(touple)和集合(set).字典是一个key/value的集合,key可以是任意可 ...
- 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)
强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...