package com.company.typeinfo.packageacess;
import com.company.typeinfo.interfacea.A;
class C implements A {
public void f() { System.out.println("C.f()");};
public void g() { System.out.println("C.g()");};
void u() { System.out.println("C.u()");};
protected void v() { System.out.println("C.v()");};
private void w() { System.out.println("C.w()");};
}
public class HiddenC{
public static A makeA(){ return new C();}
}
package com.company.typeinfo.interfacea;
public interface A {
void f();
}
package com.company;
import java.lang.reflect.*;
import com.company.typeinfo.interfacea.A;
import com.company.typeinfo.packageacess.*;
public class Main{
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
A a = HiddenC.makeA();
a.f();
System.out.println(a.getClass().getName());
//编译出错,找不到C 因为有C类的java文件,C不是public的,所以找不到C
// C c = (C)a;
// c.g();
//利用反射来实现
callHiddenMethod(a, "g");
callHiddenMethod(a, "u");
callHiddenMethod(a, "v");
callHiddenMethod(a, "w");
}
static void callHiddenMethod(Object a, String methodName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method g = a.getClass().getDeclaredMethod(methodName);
g.setAccessible(true);
g.invoke(a);
}
}
这个例子告诉我们,强制类型转换做向下转型,在一些场合并不适用。本例中,C类在com.company.typeinfo.packageacess中,但不是public类型的,所以在执行时,找不到C类。但利用反射,可以帮我们完成向下转型去调用子类新定义的方法,即便是private方法
反射能到达并调用非公共访问权限的方法,即便是private域