getDeclaredMethod 和 getMethod 的区别

来源:互联网 发布:xmind8 for mac序列号 编辑:程序博客网 时间:2024/06/13 08:37

在使用反射的时候,会用到  a.getClass.getMethod 和 a.getClass.getDeclaredMethod.

二者的区别就在于,前者返回的是a所在类的所有public 方法,而后者返回的是其所在类的所有方法。

以下程序段在不同包中:

ss中定义了类C以及实现并通过HiddenC得到A类型的实例:

package ss;class C implements A{    @Override    public void a() {        System.out.println("class ss.C.a");    }    void b(){        System.out.println("class ss.C.b");    }    protected void c(){        System.out.println("class ss.C.c");    }    private void d(){        System.out.println("class ss.C.d");    }}public class HiddenC {    public static A getIns(){        return new C();    }}


hideC包中,通过调用HiddenC直接得到A的实例,无法直接使用a的全部方法,因为a的最根本类型为C,却转换成了A类型。

但是通过反射机制,通过getDeclaredMethod(methodName)可以调用到a对象作为C类对象的所有方法。当然,这么使用必须假定你事先知道C的所有方法。

package hideC;import ss.A;import ss.HiddenC;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * Created with IntelliJ IDEA. * User: Ghost * Date: 14-8-17 * Time: 下午10:36 * To change this template use File | Settings | File Templates. */public class HiddenImp {    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {        A a = HiddenC.getIns();        callHiddenMethod(a,"a");        callHiddenMethod(a,"b");        callHiddenMethod(a,"c");    }    static void callHiddenMethod(Object a,String methodName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {        Method g = a.getClass().getDeclaredMethod(methodName);        g.setAccessible(true);        g.invoke(a);    }}

0 0
原创粉丝点击