java反射机制调用私有方法
2016-02-22 18:35
681 查看
某些特殊情况下我们需要调用类的私有方法,这时候我们就可以用java的反射机制来实现这一需求。
下面直接上代码
调用MyMethod的私有方法setPeople
最后来看下LOG
111 mName = wang, mNumber = 100
Class = class MyMethod
Class = class MyMethod
method = private void MyMethod.setPeople(java.lang.String,int)
222 mName = zhangsan, mNumber = 90
finish!
从log可以看出,成功实现了setPeople方法
这里顺便说一下用反射机制的一大用就是,当我们作为一个项目的独立模块需要调用外部类,而在集成之前我们并没有这个接口可以调用,
导致必然编译不过而无法测试其他功能,这时候我们可以用如上反射方法来事先做好接口调用。
这里我们将ReflectionMethod.java中的Method method = classType.getDeclaredMethod(“setPeople”, new Class[] { String.class, int.class });改成
Method method = classType.getDeclaredMethod(“XXXX”, new Class[] { String.class, int.class });
然后编译运行LOG如下
111 mName = wang, mNumber = 100
Class = class MyMethod
Class = class MyMethod
error: java.lang.NoSuchMethodException: MyMethod.XXXX(java.lang.String, int)
222 mName = wang, mNumber = 100
finish!
可以看到没有XXXX函数,但是程序还是正常运行来。
下面直接上代码
调用MyMethod的私有方法setPeople
public class MyMethod { private String mName = "wang"; private int mNumber = 100; public String getName(){ return mName; } public int getNumber(){ return mNumber; } private void setPeople(String newName, int newNumber){ mName = newName; mNumber = newNumber; } }
import java.lang.reflect.Method; public class ReflectionMethod { public static void main(String[] args) throws Exception{ MyMethod mClass = new MyMethod(); Class<?> classType = mClass.getClass(); System.out.println("111 mName = "+mClass.getName()+", mNumber = "+mClass.getNumber()); //log可以看到classType和MyMethod.class是一样的 System.out.println("Class = "+classType); System.out.println("Class = "+MyMethod.class); try { // 获取Method对象,其中setPeople为函数名,String.class和int.class分别为它的两个参数类型 Method method = classType.getDeclaredMethod("setPeople", new Class[] { String.class, int.class }); System.out.println("method = "+method); // 抑制Java的访问控制检查,不写这句下面访问私有方法时将报错。 method.setAccessible(true); //这里调用mClass的method方法,后面两个为method的参数 method.invoke(mClass, "zhangsan", 90); }catch (NoSuchMethodException e) { System.out.println("error: "+e); }catch (IllegalAccessException e) { System.out.println("error: "+e); } System.out.println("222 mName = "+mClass.getName()+", mNumber = "+mClass.getNumber()); System.out.println("finish! "); } }
最后来看下LOG
111 mName = wang, mNumber = 100
Class = class MyMethod
Class = class MyMethod
method = private void MyMethod.setPeople(java.lang.String,int)
222 mName = zhangsan, mNumber = 90
finish!
从log可以看出,成功实现了setPeople方法
这里顺便说一下用反射机制的一大用就是,当我们作为一个项目的独立模块需要调用外部类,而在集成之前我们并没有这个接口可以调用,
导致必然编译不过而无法测试其他功能,这时候我们可以用如上反射方法来事先做好接口调用。
这里我们将ReflectionMethod.java中的Method method = classType.getDeclaredMethod(“setPeople”, new Class[] { String.class, int.class });改成
Method method = classType.getDeclaredMethod(“XXXX”, new Class[] { String.class, int.class });
然后编译运行LOG如下
111 mName = wang, mNumber = 100
Class = class MyMethod
Class = class MyMethod
error: java.lang.NoSuchMethodException: MyMethod.XXXX(java.lang.String, int)
222 mName = wang, mNumber = 100
finish!
可以看到没有XXXX函数,但是程序还是正常运行来。
相关文章推荐
- 简单介绍java Enumeration
- 希尔排序-java
- java后端校验
- struts2
- Java中Comparable和Comparator实现对象比较
- Java设计模式 · 单例模式
- <java>使用三种循环方式输出九九乘法表
- Spring Boot入门===Hello World
- 给eclipse装一些插件
- java知识总结(更新中)
- Spring注解@Component、@Repository、@Service、@Controller区别
- struts2.0中struts.xml配置文件详解
- java jar的动态加载和释放
- Java Thread.interrupt interrupted
- Java语法基础2(思维导图)
- java获取各种格式的时间,获取昨天明天日期,获取一天的开始结束时间
- STS: Spring Boot and Spring MVC
- spring 父子容器 重复初始化
- java发送统计邮件内容html
- 每个java初学者都应该搞懂的问题!