利用java反射调用类的的私有方法
来源:互联网 发布:2017 淘宝 大麻 编辑:程序博客网 时间:2024/05/21 12:08
1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根本不区分是否是private的,没有想到调用本身的私有方法是可以的,但是调用父类的私有方法则不行,后来纠其原因很有可能是因为getDeclaredMethod方法和getMethod方法并不会查找父类的私有方法,于是只好自己写递归了,经过尝试果然如此。把代码放出来方便更多人。这段代码可以解决很多实际问题,不过利用反射来做的话性能不会太好。
- package com.syj.util.reflect;
- import java.lang.reflect.Method;
- /**
- * <p>
- * Title: 私有方法调用工具类
- * </p>
- *
- * <p>
- * Description:利用java反射调用类的的私有方法
- * </p>
- *
- * <p>
- * Copyright: Copyright (c) 2007
- * </p>
- *
- * @author 孙钰佳
- * @main sunyujia@yahoo.cn
- * @date Jun 1, 2008 10:18:58 PM
- */
- public class PrivateUtil {
- /**
- * 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层Object对象为止。
- *
- * @param clazz
- * 目标类
- * @param methodName
- * 方法名
- * @param classes
- * 方法参数类型数组
- * @return 方法对象
- * @throws Exception
- */
- public static Method getMethod(Class clazz, String methodName,
- final Class[] classes) throws Exception {
- Method method = null;
- try {
- method = clazz.getDeclaredMethod(methodName, classes);
- } catch (NoSuchMethodException e) {
- try {
- method = clazz.getMethod(methodName, classes);
- } catch (NoSuchMethodException ex) {
- if (clazz.getSuperclass() == null) {
- return method;
- } else {
- method = getMethod(clazz.getSuperclass(), methodName,
- classes);
- }
- }
- }
- return method;
- }
- /**
- *
- * @param obj
- * 调整方法的对象
- * @param methodName
- * 方法名
- * @param classes
- * 参数类型数组
- * @param objects
- * 参数数组
- * @return 方法的返回值
- */
- public static Object invoke(final Object obj, final String methodName,
- final Class[] classes, final Object[] objects) {
- try {
- Method method = getMethod(obj.getClass(), methodName, classes);
- method.setAccessible(true);// 调用private方法的关键一句话
- return method.invoke(obj, objects);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- public static Object invoke(final Object obj, final String methodName,
- final Class[] classes) {
- return invoke(obj, methodName, classes, new Object[] {});
- }
- public static Object invoke(final Object obj, final String methodName) {
- return invoke(obj, methodName, new Class[] {}, new Object[] {});
- }
- /**
- * 测试反射调用
- *
- * @param args
- */
- public static void main(String[] args) {
- PrivateUtil.invoke(new B(), "printlnA", new Class[] { String.class },
- new Object[] { "test" });
- PrivateUtil.invoke(new B(), "printlnB");
- }
- }
- class A {
- private void printlnA(String s) {
- System.out.println(s);
- }
- }
- class B extends A {
- private void printlnB() {
- System.out.println("b");
- }
- }
程序的输出结果为
test
b
说明private方法调用成功了不管是自己的私有方法还是父类的私有方法。\
2,
package me.test;import java.lang.reflect.*; //导入反射需要的包public class ReflectTest { public static void main(String[] args) throws Exception { /* 下面通过反射完成对一个对象中成员的替换 * 并且执行执行私有方法 * 完成对 Poiont类的对象中所有的 String的对象的d换成x * 并且类中无修改方法 */ Point pt=new Point(3,5); //创建一个Point对象 Field fx=pt.getClass().getField("x") ; //获取x的映射类对象 Field fy=pt.getClass().getDeclaredField("y");//因为y是私有的所以要调用这个方法 Method m2=Point.class.getDeclaredMethod("showPrivate") ;//获得私有方法映射类 //利用反射调用共有输出 m2.setAccessible(true) ;// 修改showPrivate 权限 改变为可以调用 m2.invoke(pt) ;//执行私有方法 //利用成员反射输出x 和 私有的 y System.out.println(fx.getInt(pt));//反射输出x fy.setAccessible(true) ;//改变私有为可访问 System.out.println(fy.getInt(pt));//输出私有y //替换成员后并且反射私有方法输出 changeString(pt) ;//反射替换成员值 System.out.println(pt); } public static void changeString(Object obj) throws Exception//反射替换对所有String进行替换 { Field[] f=obj.getClass().getFields() ; //获得成员映射数组 for(Field tem : f) //迭代for循环 { if(tem.getType()==String.class) //内存中只有一份String字节码 { String oldString=(String)tem.get(obj) ; //返回内容 String newString=oldString.replace('d', 'x');//将所有b替换为x tem.setAccessible(true); tem.set(obj, newString) ;//替换成员值 } } }}public class Point{ public int x ; private int y ; public Point(int x, int y) { super(); this.x = x; this.y = y; } public String a="dsfdsfd" ; //只有 共有可以替换 public String b="fdsfdsfewewwwww" ; public String c="adddssss" ; private void showPrivate() //私有方法输出 { System.out.println("x="+this.x+"\n"+"y="+this.y); System.out.println(this.a); System.out.println(this.b); System.out.println(this.c); } public String toString() { return this.a+"\n"+this.b+"\n"+this.c; }}
3,
Java利用反射来获取一个方法的 范型化参数 Vector<Integer>的类型
class A{ public void show(Vector<Integer> v) {}} 在我们不知道Vector中数据的类型的时候 这时候我们只知道这个方法的名字 和参数的个数 ,我们来获取 范型化的实际类型 。 我们不可能通过 Vector对应的Class类来反射出 泛型集合中的类型 ,但是 我们却可以通过 这个方法所对应的Method类来实现 。具体如下 :import java.lang.reflect.Method;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.Vector;public class Test3{ public static void main(String []args) throws SecurityException, NoSuchMethodException { Method m=A.class.getMethod("show", Vector.class) ; //反射获得show方法的Method对象 Type[]t=m.getGenericParameterTypes() ; //获得范型参数的 一个Type数组 Type是Class类的基类 GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType 这些都是 实现Type的子接口 ParameterizedType p=(ParameterizedType)t[0]; //强制转换成Type的子接口 ParameterizedType类型 因为这个接口又可以获得 范型化集合中元素的类型 System.out.println(p.getRawType()); //获得集合的类型 System.out.println(p.getActualTypeArguments()[0]); //获得集合中元素的类型 }}
- 利用java反射调用类的的私有方法
- 利用java反射调用类的的私有方法
- 利用java反射调用类的的私有方法
- 利用java反射调用类的的私有方法
- 利用java反射调用类的的私有方法
- 利用java反射调用类的的私有方法
- 利用java反射调用类的的私有方法
- 利用java反射调用类的的私有方法
- 利用java反射调用类的的私有方法
- 利用java反射机制调用类的私有方法
- java利用反射来调用一个类的私有方法
- java如何利用反射机制调用类的私有方法
- 利用java反射调用类的的私有方法(包括父类中的私有方法)
- 利用java的反射机制调用类的私有方法及私有属性
- 利用java反射调用类及父类的的私有方法
- java利用反射来调用一个类的私有方法和成员变量
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- Java笔记:[反射篇] 利用反射,获取类中的私有内部类对象,并调用该对象的方法
- Ext.define 方法
- Cocos2d-x游戏开发的一些注意事项
- IIS 支持flv视频格式的方法
- Centos 5.5安装教程(图文)
- DEDE单本小说网站源码[无错版]
- 利用java反射调用类的的私有方法
- 07-windowsPhone常用控件----文本块适应换行属性,换行属性
- sql编程基本语法
- hadoop 函数阅读笔记之releaseSlot()
- iMatrix平台的建设使企业面临IT系统的快速业务需求变化得到改善
- UML类图的绘制
- 致刚刚过去的第一年
- Apache 配置文件内容的书写有点猥琐
- win7休眠的开启与关闭方法