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