通过JAVA的反射调用类中的公有私有方法
文章来源http://lavasoft.blog.51cto.com/62575/61002及http://blog.csdn.net/sunyujia/article/details/2501709
一直对于JAVA下的反射不是很清楚。虽然自己做J2me和android也做了几年了,实在惭愧。
晚上在查看xmpp下的重连源码时,发现Asmack下有重连机制,但类的构造函数是私有的,也未能找到外部调用的方法。于是想到了用反射来调用,但对于反射不是很熟悉,只好百度找大牛的文章,文章是找到了,但第一篇文章中只实现了调用公有的方法,而私有的方法却未说明,于是又百度找方法,在第二篇文章中找到了,将它记录下来,在这里谢谢两位大牛了;
这是个测试用的例子,通过反射调用对象的方法。取自第一篇文章;
import 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 static void 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反射的测试类");}
}
调用的方法如下:(在main中调用)
Fanshe foo = new Fanshe("这个一个Foo对象!");Class clazz = foo.getClass();Method m1 = clazz.getDeclaredMethod("outInfo");// m1.setAccessible(true); //这句话很重要,对于调用私有方法时需要用到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);
在JAVA环境下运行没有问题;但当把其中一个方法改成私有的时候,会报安全权限的异常,异常如下:
java.lang.IllegalAccessException: Class TestMain can not access a member of class Fanshe with modifiers "private"
在第二篇文章中找到了解决的方法。解决方法就是注释的那一行,将注释的那行去掉注释后,就可以正常运行了。
对于注释下的那一行,添加了一个String.class的参数。我的理解是,因为setMsg这个方法需要传入一个参数进去,参数类型是string型,所以需要引用到String.class这个类。
若参数换成别的基本类型时,将需要引用到其它基本类型的类。为了验证是不是自己理解的这样子,我将Foo中setMsg();的参数改成了int型,并将测试类中修改参数为int.class,这时测试通过,如自己理解;
通过JAVA的反射调用类中的公有私有方法相关推荐
- 一个java程序中什么是主类_下列哪个是Java应用程序主类中正确的main方法?_学小易找答案...
[判断题]用佛尔哈德法测定Ag + 时,不用先除去氮的低价氧化物.汞盐等杂质. [单选题]下列哪个是Java应用程序主类中正确的main方法? [判断题]javac.exe 命令文件存放在 JDK 安 ...
- Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...
- 反射_通过反射调用类中指定方法、属性
一.调用指定方法 通过反射,调用类中的方法,通过Method类完成.步骤: 1.通过Class类的getMethod(String name,Class.......parameterTypes)方法 ...
- java private 接口_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- python私有函数实现_024孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘...
(完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我们定义类时是否在类的内部代码块中定义过它们,这些私有方法都是存在的.比 ...
- java通过反射调用方法_Java_通过反射调用类中的方法
packagecom.lkb.autoCode.util;importcom.lkb.autoCode.constant.AutoCodeConstant;importjava.lang.reflec ...
- java—使用反射对类进行操作(Class对象获取类名,包名,父类,接口,构造方法,普通方法,属性)
(一)Class对象获取类名,包名,父类,接口 前提条件: 有两个接口IMessage,SystemEdition 一个父类Father 一个子类Son继承父类,实现两个接口IMessage,Syst ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- 利用java反射调用类的的私有方法
http://blog.csdn.net/sunyujia/article/details/2501709 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根 ...
最新文章
- VS2008让Release配置也能调试起来~
- Python爬虫并自制新闻网站,太好玩了
- CICD流程设计及openshift与k8s的命令对比
- boost::push_relabel_max_flow用法的测试程序
- spring-note-01
- maven(6)仓库
- 前端学习(2423):补充markdown语法补充
- Linux kernel之SMP初始化
- 从编程语言排行来看:C/C++一直占有前三之位,为何C++不会消亡?
- MTCNN-tensorflow源码解析-gen_12net_data.py
- 【Hive】Hive的三种交互方式
- Java虚拟机中的堆(Heap)
- 机器学习实战课后习题(四)
- javascript计算两条直线的夹角
- 分享一个超酷创建互动文档的Javascript类库 - tangle
- The essense of the software atchitecture
- kubectl源码分析之drain
- [ZJOI2007]矩阵游戏(二分图匹配、匈牙利算法)
- 无法定位程序输入点?isPublicID@QXmlUtils@@SA_NAEVVQString@@@Z于动态链接库 D:\Qt\Qt5.7.0\5.7\msvc2015_64\bin\Qt5Cored
- 希腊字母读音及科学上的应用