guokehua(@yahoo.com.cn oy Java 1010 附3多态和反射 2008-3-10 郭克华EE框架实战教学视频
2008-3-10 1 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 附3多态和反射
guokehua(@yahoo.com.cn 了y多态性 静态多态性: 函数重载三种情况 1010 ·动态多态性 父类(抽象类,接口)引用指向子类(实现类) 对象 函数参数传递 用对话框的例子来说明这个问题 008-3-10 郭克华J2EE框架实战教学视频
2008-3-10 2 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 多态性 • 静态多态性: – – 函数重载三种情况 函数重载三种情况 • 动态多态性: – – 父类(抽象类,接口)引用指向子类(实现类) 对象 – – 函数参数传递 – – 用对话框的例子来说明这个问题 用对话框的例子来说明这个问题
guokehua(@yahoo.com.cn oy Java Java中,反射是一种强大的工具。它使您能够创建灵活的代码, 这些代码可以在运行时装配,无需在组件之间进行源代码链接。 反射允许我们在编写与执行时,使我们的程序代码能够接入装载 到VM中的类的内部信息,而不是源代码中选定的类协作的代码。 这使反射成为构建灵活的应用的主要工具。 个典型的例子: Customer cus=new Customer 和 String str=“ Customer” str cus=new strO 有什么区别? 反射的基础: Class类 008-3-10 郭克华J2EE框架实战教学视频
2008-3-10 3 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 • Java中,反射是一种强大的工具。它使您能够创建灵活的代码, 这些代码可以在运行时装配,无需在组件之间进行源代码链接。 反射允许我们在编写与执行时,使我们的程序代码能够接入装载 到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。 这使反射成为构建灵活的应用的主要工具。 • 一个典型的例子: • Customer Customer cus = new Customer(); = new Customer(); • 和 • String str = “Customer Customer”; • str cus = new str(); • 有什么区别? • 反射的基础: Class类
guokehua(@yahoo.com.cn oy Java! 基础1:获取一个Cass对象(包装一个类的基本信息) ·从对象的实例获取 1010 Class c=mystery. getclasso 如果类名在编译时是未知的,则可 以使用Cla: Nameo方法来获取 Class c=Class forName(class String) 1·获取类名称: c.getNameo 注意看Clas的文档 008-3-10 郭克华J2E框架实战教学视频
2008-3-10 4 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 基础1:获取一个Class对象(包装一个类的基本信息) • 从对象的实例获取。 从对象的实例获取。 – –Class c = mystery. Class c = mystery.getClass getClass(); • 如果类名在编译时是未知的,则可 如果类名在编译时是未知的,则可 以使用Class.forName forName()方法来获取. – –Class c = Class. Class c = Class.forName forName(classString classString); • 获取类名称: c.getName getName(); • 注意看Class的文档
guokehua(@yahoo.com.cn oy Java! 基础2:检索指定类的构造函数 每一个构造方法可以用类 Constructor来描述,,包括名称,修饰 符,参数类型CasS,和异常列表 可以通过一个 ClassE]getConstructors方法获取到该类的 Constructor 1010 数组。 Class c=o.getclasso Constructor[ the Constructors=c. getConstructorso for (int i=0; 1< the Constructors length; 1++)( Classl parameter Types the Constructors[]. getParameter Types for (int k=0; k< parameter Types. length; k++)i String parameterString- parameter Types[ k] getName0 008-3-10 郭克华J2EE框架实战教学视频
2008-3-10 5 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 基础2:检索指定类的构造函数 :检索指定类的构造函数 • 每一个构造方法可以用类Constructor Constructor来描述,,包括名称,修饰 符,参数类型(Class[]) Class[]),和异常列表。 • 可以通过一个Class的getConstructors getConstructors方法获取到该类的Constructor Constructor 数组。 Class c = o. Class c = o.getClass getClass(); Constructor[] Constructor[] theConstructors theConstructors = c.getConstructors getConstructors(); for (int i = 0; i < i = 0; i < theConstructors theConstructors.length; i++) { .length; i++) { Class[] Class[] parameterTypes parameterTypes = theConstructors theConstructors[i].getParameterTypes getParameterTypes(); for (int k = 0; k < k = 0; k < parameterTypes parameterTypes.length; k ++) { .length; k ++) { String parameterString parameterString = parameterTypes parameterTypes[k].getName getName(); } }
guokehua(@yahoo.com.cn 了y基础3:检索方法 可以找到隶属于一个类的所有方法,通过 getMethods包 含 Method数组,进而得到该方法的返回类型,修饰符, 方法名称,参数列表 1010 Class c=o.getclasso; Method[ theMethods =c. getMethodso; for (int i=0; i< theMethods length; 1++) String methodString=theMethods[i]. getNameO String returnString theMethodsi].getReturnType( getNameO Classl parameter Types= theMethods[i].getParameterTypes(: for (int k=0; k< parameter Types. length; k++)i String parameterString= parameter Types[k]. getNameO 008-3-10 郭克华J2EE框架实战教学视频
2008-3-10 6 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 基础3:检索方法 • 可以找到隶属于一个类的所有方法,通过 可以找到隶属于一个类的所有方法,通过getMethods getMethods包 含Method数组,进而得到该方法的返回类型,修饰符, 数组,进而得到该方法的返回类型,修饰符, 方法名称,参数列表 方法名称,参数列表 Class c = o. Class c = o.getClass getClass(); Method[] Method[] theMethods theMethods = c.getMethods getMethods(); for (int i = 0; i < i = 0; i < theMethods theMethods.length; i++) { .length; i++) { String methodString methodString = theMethods theMethods[i].getName getName(); String returnString returnString = theMethods theMethods[i].getReturnType getReturnType().getName(); Class[] Class[] parameterTypes parameterTypes = theMethods theMethods[i].getParameterTypes getParameterTypes(); for (int k = 0; k < k = 0; k < parameterTypes parameterTypes.length; k ++) { .length; k ++) { String parameterString parameterString = parameterTypes parameterTypes[k].getName getName(); } }
guokehua(@yahoo.com.cn 了y使用:创建对象 方法1 Class class Definition= Class for Name( class Name);/指定类的运 行期实例 1010 object= classDefinition. newInstanceO;/调用无参构造函数来生 成指定类的实例。 方法2 a,创建一个 Class对象 b,创建一个 Constructor对象, getConstructor( Classl params)方 法,参数是一个与构造方法相适合的 Class数组 c,在 Constructor,对象上调用 newInstance方法来生成一个对象, 参数是一个 object数组与这个构造方法相配备。 008-3-10 郭克华J2EE框架实战教学视频
2008-3-10 7 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 使用1:创建对象 • 方法1 – – Class classDefinition classDefinition = Class. = Class.forName forName(className className);//指定类的运 行期实例 – – object = object = classDefinition classDefinition.newInstance newInstance();//调用无参构造函数来生 成指定类的实例。 • 方法2 – – a,创建一个Class对象 – – b,创建一个Constructor Constructor对象,getConstructor getConstructor(Class[] (Class[] params)方 法,参数是一个与构造方法相适合的Class 数组. – – c,在Construct Constructor对象上调用newInstance newInstance方法来生成一个对象, 参数 是一个object数组与这个构造方法相配备
guokehua(@yahoo.com.cn 了使用2:调用方法 a创建一个 Class对象 ·b创建一个方法对象 method, getMethod(String methodName, Classi)方法 c调方法对象, method. invoke( object, Objecti),两个 参数第一个是指调用方法所属于的 对象,第二个是传递的值对象列表。 008-3-10 郭克华J2EE框架实战教学视频
2008-3-10 8 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 使用2:调用方法 • a.创建一个Class对象 • b.创建一个方法对象 创建一个方法对象 method, method,getMethod getMethod(String (String methodName methodName,Class[]) ,Class[])方法 • c.调方法对象, method.invoke(object,Object[]), method.invoke(object,Object[]),两个 参数,第一个是指调用方法所属于的 第一个是指调用方法所属于的 对象,第二个是传递的值对象列表。 对象,第二个是传递的值对象列表
guokehua(@yahoo.com.cn 了y应用 针对对话框的例子,能否用反射 来将模块切换灵活化 008-3-10 郭克华J2EE框架实战教学视频
2008-3-10 9 oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 应用 • 针对对话框的例子,能否用反射 针对对话框的例子,能否用反射 来将模块切换灵活化 来将模块切换灵活化?