`

反射调用父类方法

阅读更多

/**
* 类 描 述 :

* 修改备注:
* 创建时间:Aug 22, 2014 11:37:31 AM
*  今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现
*  因为在反射看来根本不区分是否是private的,没有想到调用本 身的私有方法是可以的,
*  但是调用父类的私有方法则不行,后来纠其原因很有可能是因为getDeclaredMethod方法和getMethod方法并不
*  会查找父类的私有方法,于是只好自己写递归了,经过尝试果然如此。把代码放出来方便更多人。
*  这段代码可以解决很多实际问题,不过利用反射来做的话性能不会 太好。
*/
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"); 
    } 
分享到:
评论

相关推荐

    C#中子类调用父类的实现方法

    主要介绍了C#中子类调用父类的实现方法,通过实例逐步分析了类中初始化构造函数的执行顺序问题,有助于加深对C#面向对象程序设计的理解,需要的朋友可以参考下

    基础深化和提高-java反射技术

    获取类的信息:通过反射可以获取类的名称、父类、接口、方法、字段等信息。 实例化对象:通过反射可以实例化一个类的对象,即使在编译时并不知道具体的类名。 调用方法:通过反射可以动态调用对象的方法,包括公有...

    Java反射机制重点总结

    文章目录Java ReflectionJava反射机制提供的功能Java反射相关的主要API...反射调用类的完整结构获取实现的全部接口获取所继承的父类获取全部的构造器获取全部的方法获取全部的属性获取Annotation相关获取泛型相关获取...

    利用宏实现反射机制

    用宏实现反射,在调用的时候,只须在父类和基类中写上一句话,即可。很方便。

    Java对象(最后面是序列化的知识)1

    (1)New操作(2)调用类的静态方法(3)访问类的静态域(不是final的常值常量)(4)进行反射操作(4)创建对象的实例(1)调用父类的构造函数(如果在代码

    day021-反射和注解笔记和代码.rar

    Method[] methods = clazz.getMethods() 获取public修饰的构造方法数组,有父类中的方法 Method[] methods = clazz.getDeclaredMethods() 获取任意访问权限所有造方法数组,并且都是自己的方法 Method ...

    反射机制 上课示例

    获得类名 判断是接口还是类 获得修饰符 final public 获得父类 获得接口 获得字段 (某个,所有) 获得字段类型 ...调用无参数无返回值方法 调用有参数有返回值方法 调用构造来创建实例 有非常详细的注释

    常见的java面试题及解答

    继承允许子类继承父类的方法和属性,同时可以重写父类的方法,从而实现多态。接口则允许不同的类通过实现同一个接口来达到多态的效果。 Java中如何避免空指针异常? 在Java中,可以通过对可能为空的对象进行“非空...

    java相关的2024面试题集锦

    - 使用Java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化 - 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化 - 当虚拟机...

    php-static-reflection:静态反射API

    解决常量,属性和方法需要查看父类,使用的特征和已实现的接口。 此解析根据需要完成(即,延迟加载),因此默认情况下将缓存反射对象。 因此,有可能通过从缓存中卸载反射对象来进一步减少内存使用,这些反射对象...

    Python中的super用法详解

    在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: 复制代码 代码如下:  class A:  def __init__(self):  print “enter A”  print “leave A”  ...

    cglib.jar下载

    在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。 CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须...

    netty-source-study:netty原始学习

    创建NioServerSocketChannelConfig()[tcp参数配置类]调用父类AbstractNioChannel()构造函数configureBlocking(false) ),unsafe(渠道紧张的操作),管道]初始化channel int()[初始化入口]设置...

    C# IsDefined的问题

    在.NET 4.0(当然也包括4.0以前的版本)下,用反射判断某个方法是否运用了自定义Attribute时,可以通过调用MethodInfo的IsDefined()方法进行确认。当然,IsDefined()方法事实上定义在MethodInfo的父类MemberInfo中,但...

    Java-了解注解及其应用

     解@Deprecated,调用者反射时明白这方法已过时  3、注解在哪标记,也是说能为哪些元素标记?  可以在包、类、字段、方法、局部变量  二、自定义注解及其应用  1、先定义个注解类,如下代码:

    Java并发学习-AtomicIntegerFieldUpdater字段原子更新类.docx

     也就是说调用者能够直接操作对象字段 ,那么就可以反射进行原子操作。 对于父类的字段,子类是不能直接操作的,尽管子类可以访问父类的字段。 只能是实例变量,不能是类变量,也就是说不能加static关键字。 ...

    java编程常见问题

    33.java.lang.OutOfMemoryError 内存不足错误。当可用内存不足以让Java...当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。

    Scala程序设计(第2版)

    8.8 调用父类构造器(与良好的面向对象设计) 226 8.9 嵌套类型 230 8.10 本章回顾与下一章提要 232 第9章 特征 233 9.1 Java 8中的接口 233 9.2 混入trait 234 9.3 可堆叠的特征 238 9.4 ...

Global site tag (gtag.js) - Google Analytics