内容发布更新时间 : 2025/3/4 19:42:39星期一 下面是文章的全部内容请认真阅读。
Java反射机制应用实践
引导语:通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,以下是的Java反射机制应用实践,欢迎参考阅读! 反射基础
p.s:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类: Strings=\ Classc=s.getClass(); 通过forName方法
我们也可以调用Class类的静态方法forName: Classc=Class.forName(\ 使用.class
或者我们也可以直接使用.class: Classc=String.class; 获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。 首先我们在typeinfo.interfacea包下面新建一个接口A: packagetypeinfo.interfacea; publicinterfaceA{voidf();}
接着我们在typeinfo.packageaess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。 packagetypeinfo.packageaess; importtypeinfo.interfacea.A; classCimplementsA{
publicvoidf(){System.out.println(\ publicvoidg(){System.out.println(\
protectedvoidv(){System.out.println(\ voidu(){System.out.println(\ privatevoidw(){System.out.println(\ }
publicclassHiddenC{
publicstaticAmakeA(){returnnewC();} }
在callHiddenMethod()方法中我们用到了几个新的API,其中getDeclaredMethod()根据方法名用于获取Class类指代对象的某个方法,然后我们通过调用invoke()方法传入实际的对象就可以触发对象的相关方法: packagetypeinfo;
importtypeinfo.interfacea.A; importtypeinfo.packageaess.HiddenC; importjava.lang.reflect.Method; publicclassHiddenImplementation{
publicstaticvoidmain(String[]args)throwsException{ Aa=HiddenC.makeA(); a.f();
System.out.println(a.getClass().getName()); //Oops!Reflectionstillallowsustocallg(): callHiddenMethod(a,\
//Andevenmethodsthatarelessaessible! callHiddenMethod(a,\ callHiddenMethod(a,\ callHiddenMethod(a,\ }