现在的位置: 首页 > 综合 > 正文

getDeclaredMethod 和 getMethod 的区别

2017年12月22日 ⁄ 综合 ⁄ 共 1310字 ⁄ 字号 评论关闭

在使用反射的时候,会用到  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);
    }
}

抱歉!评论已关闭.