通过Java反射调用方法
来源:互联网 发布:马扎克数控车床编程 编辑:程序博客网 时间:2024/06/04 19:07
getDeclaredMethod*()
获取的是类自身声明的所有方法,包含public、protected和private方法。
getMethod*()
获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。
传送:http://lavasoft.blog.51cto.com/62575/61002/这是个测试用的例子,通过反射调用对象的方法。 TestRef.javaimport java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException;/** * Created by IntelliJ IDEA. * File: TestRef.java * User: leizhimin * Date: 2008-1-28 14:48:44 */ public class TestRef { public staticvoid main(String args[]) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { Foo foo = new Foo("这个一个Foo对象!"); Class clazz = foo.getClass(); Method m1 = clazz.getDeclaredMethod("outInfo"); Method m2 = clazz.getDeclaredMethod("setMsg", String.class);//可看做形参的类型 Method m3 = clazz.getDeclaredMethod("getMsg");//可看做形参的类型,没有则不用谢 m1.invoke(foo); //可看做实参的数据,没有则不用写 m2.invoke(foo, "重新设置msg信息!"); //可看做实参的数据 String msg = (String) m3.invoke(foo); System.out.println(msg); } } class Foo { private String msg; public Foo(String msg) { this.msg = msg; } public void setMsg(String msg) { this.msg = msg; } public String getMsg() { return msg; } public void outInfo() { System.out.println("这是测试Java反射的测试类"); } } 控制台输出结果:这是测试Java反射的测试类 重新设置msg信息! Process finished with exit code 0 传送门:http://blog.csdn.net/hbcui1984/article/details/2719089JAVA反射使用手记 本篇文章为在工作中使用Java反射的经验总结,也可以说是一些小技巧,以后学会新的小技巧,会不断更新。本文不准备讨论JAVA反射的机制,网上有很多,大家随便google一下就可以了。
在开始之前,我先定义一个测试类Student,代码如下:
一、JAVA反射的常规使用步骤
反射调用一般分为3个步骤:
- 得到要调用类的class
- 得到要调用的类中的方法(Method)
- 方法调用(invoke)
代码示例:
二、方法调用中的参数类型
在方法调用中,参数类型必须正确,这里需要注意的是不能使用包装类替换基本类型,比如不能使用Integer.class代替int.class。
如我要调用Student的setAge方法,下面的调用是正确的:
而如果我们用Integer.class替代int.class就会出错,如:
jvm会报出如下异常:
三、static方法的反射调用
static方法调用时,不必得到对象示例,如下:
四、private的成员变量赋值
如果直接通过反射给类的private成员变量赋值,是不允许的,这时我们可以通过setAccessible方法解决。代码示例:
运行如上代码,系统会报出如下异常:
解决方法:
其实,在某些场合下(类中有get,set方法),可以先反射调用set方法,再反射调用get方法达到如上效果,代码示例:
Java反射,参数为数组
使用反射调用非公开的方法有时能解决许多问题,如果方法的参数是数组时类型该怎么传递呢?这里找到了一种方法记录一下
实例
比如:
class A{ private void sayHello(String[] names){ //... System.out.println("sayHello invoked"); } }String[] names = new String[]{"A", "B", "C"};Method sayHello = A.class.getDeclaredMethod("sayHello", String[].class);sayHello.setAcess(true);sayHello.invoke(new A(), new Object[]{names});
这里有两个地方需要注意
- A.class.getDeclaredMethod时后面的参数是数组,用加[];
- sayHello.invoke调用时直接传一个String[]实例会报异常,需要再次用Object[]包装一下;
0 0
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- java通过反射调用方法
- Java 通过反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- Java通过反射调用方法
- 通过Java反射调用方法
- 通过Java反射调用方法
- Java--通过Java反射调用方法
- Java通过反射实现方法调用
- 通过java反射调用远程方法
- ViewPager
- java的内存模型
- Ask, Attend and Answer: Exploring Question-Guided Spatial Attention for Visual Question Answering
- 2017 智慧树 文艺复兴经典名著选读答案题库
- C++中虚析构函数的作用
- 通过Java反射调用方法
- org.apache.shiro.cache.cacheException异常
- [BZOJ 1293][SCOI2009]生日礼物:单调队列
- md文件语法及目录使用
- 使用jquery获取父元素或父节点的方法
- Objective C block背后的黑魔法
- Extjs6.2.0搭建项目框架
- 实现可点击展开的 TextView
- 前端工程化开发之yeoman、bower、grunt