依赖注入(DependencyInjection, DI)也被称为控制反转(Inversionof Control,loC)。下面这个打印机的例子可以帮助读者更好的理解依赖注入。 当項目中的对象比较少时自己new对象还不会有什么问题。而一旦项目中包含多个对象时,多个对象之间的依赖关系会比较夏杂,它们之间的紧密合就会紿代码的测试和重构造成极大的困难。 在Spring下,使用依赖注入的方式对于相同的功能至于完成更少的工作。 反射使得应用的构建更加灵活,但仍需注意,如果对反射使用不当,則其成本会相当。Java的反射机制提供的主妥功能有: 1.在程序运行期间判断一个对象属于哪个类。 2.在程序运行期间构造出任意一个类的对象。 3.在程序运行期间判断任意一个类具有的成员变量和成员方法。 4.在程序运行期间调用任意一个对象的方法。 5.生成动态代理 Java的反射机只通过反射API来实现的,它允许程序在运行过程中取得任何一个已知名称的类的内部信息。反射API位于 java.lang.reflect包中,主要包括几下级类: 1.Constructor类:用来描述一个类的构造方法。 2.Field类:用来描述一个类的成员变量。 3.Method类:用来描述一个类的方法 4.Array:用来对数组进行操作。 Constroctor、Field、Method这3个类都是JVM (虚拟机)在程序运行时创建的,用来表示加载类中相应的成员。在本节内容中,我们側重介绍Field和Method这两个反射API.因为理解了它们,才能更好地理解SpringIoC容器模拟实现的项目。 在应用中,如果要使用Field和Method这两个反射API,一般要遵循如下的步骤: 首先要得到所操作的对象或类的java.lang.Class类的实例。 然后通过调用获取类中成员变量的函数,如getDeclaredFields()就可以获得该类中定义的所有成员变量的列表,通过调用获取类中方法的函數,如getDeclaredMethods()则可以获得该类中定义的所有方法的列表。 最后就可以使用反射API来操作获得的成员变量或方法了。 如何在运行中获得所操作的对象或类的Class类的实例呢?通过调用Class类的newlnstance方法便可以创建出类的实例。需要注意的是,使用newlnstance方法创建类实例时只能调用类的默认构造方法,而不能调用其带参数的构造方法。如果想调用参数的构造方法,则需要用到Constructor中的newInstance方法。 admin = Class.forName("domain.Admin");
//创建Admin实例 adminInstance = (Admin)admin.newInstance(); adminInstance.setAdminPhone("156xxxx2366"); Method getAdminPhone =admin.getMethod("getAdminPhone");//getAdminPhone()方法 //执行get方法,传入 adminInstance对象, //表示执行adminInstance的getAdminPhone方法 String phone = (String)getAdminPhone.invoke(adminInstance); // 获取对象所有属性,但不包含继承的。 Field[] declaredFields = admin.getDeclaredFields(); for (Field field : declaredFields) {System.out.println(field); } //获取对象所有公共方法 Method[] methods = admin.getMethods(); for (Method method : methods) {System.out.println(method);}
其中需要注意的是forName()方法和getClass()方法的区别。有Java开发基础的读者应该知道,一个java.lang.Class对象代表了java应用程序在运行时所加载的类或者接口实例,即被加载的类在JVM中是以Class类的实例形式存在的,Class类的对象是由JVM自动生成的。 使用Object的getClass()方法可以获取到每一个对象所对应的Class对象,然后就可以使用Class类中提供的方法来操作该Class对象以取得Class类的一些信息。在实际开发过程中,有时候无法事先知道用户要加载什么类,此时必须由用户指定要加载的类名称,再根据该类名称来加载类,在这种情况下,则可以使用Class类提供的静态方法forName()方法来实现动态的加载。 获得类中方法的函数包括: 1.MethodgetMethod(String name,Class[] paramTypes):获得类中具有指定名称、指定参数类型的公共方法,参数name指定方法的名称,paramTypes指定方法的參数类型。 2.Method[]getMethod():获得类中所有的公共方法。 3.MethodgetDeclaredMethod(String name,Class[] paramTypes):获得类中声明的具有指定名称、指定参数类型的方法,不包括从父类继承的方法,参数name指定方法的名称,参数paramTypes指定方法的参数类型.
4.Method[]getDeclaredMethod():获得类中声明的所有方法,不包括从父类继承的方法
|