Java动态机制-反射技术.ppt
Java动态机制-反射技术,Java是动态语言吗?,一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C+,Java,C#不是动态语言。尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。,Reflection 是Java被视为动态(或准动态)语言的一个关键性质Reflection的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起(调用)其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省),Java是动态语言吗?,1.Retrieving Class Objects,获取一个Class对象(metadata)1、从对象的实例获取。Class c=mystery.getClass();/(return Class)2、从子类的实例获取 TextField t=new TextField();Class c=t.getClass();Class s=c.getSuperclass();3、知道类名,则可以把.class加入到名字之后来获取。Class c=;4、如果类名在编译时是未知的,则可以使用Class.forName()方法来获取.Class c=Class.forName(classString);,2.Getting the Class Name,获取类名称 import java.awt.*;class SampleName public static void main(String args)Button b=new Button();printName(b);static void printName(Object o)Class c=o.getClass();String s=c.getName();System.out.println(s);,3.Discovering Class Modifiers,检索修饰符 1、通过getModifiers()方法获取一个整型标识值。2、通过对象的isPublic,isAbstract,和 isFinal方法判断此值.例如:public static void printModifiers(Object o)Class c=o.getClass();int m=c.getModifiers();if(Modifier.isPublic(m)System.out.println(public);if(Modifier.isAbstract(m)System.out.println(abstract);if(Modifier.isFinal(m)System.out.println(final);,4.Finding Superclasses,检索父类class SampleSuper public static void main(String args)Button b=new Button();printSuperclasses(b);static void printSuperclasses(Object o)Class subclass=o.getClass();Class superclass=subclass.getSuperclass();while(superclass!=null)String className=superclass.getName();System.out.println(className);subclass=superclass;superclass=subclass.getSuperclass();,5.Identifying the Interfaces Implemented by a Class,检索指定类实现的接口 class SampleInterface public static void main(String args)try RandomAccessFile r=new RandomAccessFile(myfile,r);printInterfaceNames(r);catch(IOException e)System.out.println(e);static void printInterfaceNames(Object o)Class c=o.getClass();Class theInterfaces=c.getInterfaces();for(int i=0;i theInterfaces.length;i+)String interfaceName=theInterfacesi.getName();System.out.println(interfaceName);,6.Examining Interfaces,判定一个类是不是接口 class SampleCheckInterface public static void main(String args)Class thread=Thread.class;Class runnable=Runnable.class;verifyInterface(thread);verifyInterface(runnable);static void verifyInterface(Class c)String name=c.getName();if(c.isInterface()System.out.println(name+is an interface.);else System.out.println(name+is a class.);,找出指定类所有的域成员 public static void main(String args)GridBagConstraints g=new GridBagConstraints();printFieldNames(g);static void printFieldNames(Object o)Class c=o.getClass();Field publicFields=c.getFields();for(int i=0;i publicFields.length;i+)String fieldName=publicFieldsi.getName();Class typeClass=publicFieldsi.getType();String fieldType=typeClass.getName();System.out.println(Name:+fieldName+,Type:+fieldType);,7、Identifying Class Fields,8.Discovering Class Constructors,检索指定类的构造函数 当创建一个类的实例时,会调用相应的检造方法。每一个构造方法可以用类Constructor来描述,包括名称,修饰符,参数类型(Class),和异常列表。可以通过一个Class的getConstructors方法获取到该类的Constructor数组。class SampleConstructor public static void main(String args)Rectangle r=new Rectangle();showConstructors(r);static void showConstructors(Object o)Class c=o.getClass();Constructor theConstructors=c.getConstructors();for(int i=0;i theConstructors.length;i+)();Class parameterTypes=theConstructorsi.getParameterTypes();for(int k=0;k parameterTypes.length;k+)String parameterString=parameterTypesk.getName();System.out.print(parameterString+);();,9.Obtaining Method Information,检索方法 通过getMethods检索包含所有Method的数组,进而得到该方法的返回类型,修饰符,方法名称,参数列表 步骤:a.指定类的Class Object b.getMethods()获取Method对象 c,遍历该数组对象,9.Obtaining Method Information,class SampleMethod public static void main(String args)Polygon p=new Polygon();showMethods(p);static void showMethods(Object o)Class c=o.getClass();Method theMethods=c.getMethods();for(int i=0;i theMethods.length;i+)String methodString=theMethodsi.getName();System.out.println(Name:+methodString);String returnString=theMethodsi.getReturnType().getName();(Return Type:+returnString);Class parameterTypes=theMethodsi.getParameterTypes();(Parameter Types:);for(int k=0;k parameterTypes.length;k+)String parameterString=parameterTypesk.getName();(+parameterString);();,10、invoke methods in runtime,运行时调用methods,