java教学0韩建雷 java反射机制release.ppt
《java教学0韩建雷 java反射机制release.ppt》由会员分享,可在线阅读,更多相关《java教学0韩建雷 java反射机制release.ppt(37页珍藏版)》请在三一办公上搜索。
1、JAVA反射机制,议程,概述主要功能分析类取得Class 对象取得类名找出超类确定某类实现的接口检查接口取得类字段取得构造方法取得方法信息取得字段的值创建对象,概述,在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。Reflection是一系列的API,它用于表示或者处理当前JVM中的类,接口和对象。,主要功能,确定一个对象的类取出类的modifiers,数据成员,方法,构造器和超类找出某个接口里定义的常量和方法
2、说明创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象)取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做倒。在运行时刻调用动态对象的方法创建数组,数组大小和类型在运行时刻才确定。也能更改数组成员的值。,分析类,如果你在编一个类浏览器程序,你就需要取得类在运行时刻的有关信息。比如,你想显示某个类的数据成员名,方法和构造器。再比如,你想显示某个类到底实现了哪些接口。这些信息可以由自省此类的Class对象来取得。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个类的有关信息。你可以通过调用Class对象的有关方法,返回特定类
3、的构造器对象,方法对象和数据成员对象。通过这些返回的对象,你就可以得到构造器,方法和数据成员的所有详细原始定义。Class对象也包含接口信息。你可以调用Class对象的某些方法来取得某接口的modifiers,方法和公共常数。如果Class对象用来表示接口,那么Class对象的部份方法就不可用。比如getConstructors,接口根本没构造器,所以这个方法就没用。,取得Class对象,如果可以取得某个类的实例,你可以调用Ojbect.getClass方法。请看例子:mystery是某个类的对象。Class c=mystery.getClass();类对象c可以直接输出,请看 JButton
4、 jb=new JButton();Class mc=jb.getClass();System.err.println(类内容+mc.toString();如果你想取得某个类对象的超类,可以用getSuperclass方法。本例中,getSuperclass方法返回TextComponent的Class对象,因为TextComponet类是TextField的超类。TextField t=new TextField();Class c=t.getClass();Class s=c.getSuperclass();运行后直接输出c和s的结果是:本类内容class javax.swing.JTex
5、tField超类内容class javax.swing.text.JTextComponent,如果你知道类在编译时的名字(类名),取出它的class对象就简单了:类名后跟“.class”后缀就行了。如:Class c1=java.awt.Button.class;System.err.println(本类内容+c1.toString();有时候,在编译的时候,对象属于哪个类,类名不知道(多态性),但是在运行的时候就知道对象属于哪个类了(运行时刻绑定)。这时候运行时刻取得对象的类就应该用forName方法。在下例中,如果字串变量strg内容是”java.awt.Button”,那么用forNa
6、me方法返回Button的Class 对象。如:,String strg=java.awt.Button;Class c2;c2=null;tryc2=Class.forName(strg);catch(ClassNotFoundException e)System.err.println(没有这个类);System.exit(1);System.err.println(forName 内容+c2.toString();,取得类名,每个类都有类名,比如下面的类名就是Pointpublic class Point int x,y;在运行时刻,类名可以调用Class对象的getName方法来取得。
7、getName返回一个字串,字串是完整的类名。下面举例:例子首先取得对象的Class对象,然后调用getName得到类名。,import java.lang.reflect.*;import java.awt.*;class SampleNamepublic 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);程序输出java.aw
8、t.Button,显示类描述符什么是类描述符呢?就是public,abstract,或者final.类描述符前面就是class关键字,请看例子:要在运行时刻知道类描述符得做以下两步工作:调用Class对象的getModifiers方法取得描述符用isPublic,isAbstract,and isFinal判断各个描述符请大家看例子。,import java.lang.reflect.*;import java.awt.*;class SampleModifierpublic static void main(String args)String s=new String();printMod
9、ifiers(s);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);从这个程序运行结果中看到String 类是public和final的。,找出超类,java的类是有继承
10、结构的,如果你想编一个类浏览程序,取得超类这一功能当然需要。用getSuperclass方法可以做到。这个方法返回超类的class对象,如果某类没有超类就返回null.如果想找某个类的父类的父类的。那你可以反复调用getSuperclass直到返回null,import java.lang.reflect.*;import java.awt.*;class SampleSuperpublic static void main(String args)Button b=new Button();printSuperclasses(b);static void printSuperclasses(
11、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();程序输出如下:java.awt.Component java.lang.Object,确定某类实现的接口,一个对象的类型不仅仅由它的类和超类决定,还
12、有一个重要因素是其接口。接口用implements说明,比如:public class RandomAccessFile implements DataOutput,DataInput要知道一个类实现多少接口可以调用getInterface方法。此方法返回一个Class对象数组。每个元素都代表此类实现的一个接口。用某个元素的getName方法可以取得接口的名字。下面的程序打印出RandomAccessFile类实现的所有接口,import java.lang.reflect.*;import java.io.*;class SampleInterfacepublic static void m
13、ain(String args)tryRandomAccessFile 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=theInte
14、rfacesi.getName();System.out.println(interfaceName);Note that the interface names printed by the sample program are fully qualified:java.io.DataOutput java.io.DataInput,检查接口,对象即可以表示接口也可以表示类。如果你搞不清一个对象到底是由接口来的还是由类来的,可以用isInterface 方法来确定。要得到接口的信息可以用Class类的方法。如果要找接口中的public常量,可以用getFields方法。用getMethods
15、 可以取得接口中的方法。要看接口的修饰符,可以用getModifiers方法。下面程序调用isInterface来确定Observer是一个接口,Observale是一个类。,import java.lang.reflect.*;import java.util.*;/*说明如何判断一个对象是接口还是对象实现的*/class SampleCheckInterfacepublic static void main(String args)Class observer=Observer.class;Class observable=Observable.class;Class jb=java.aw
16、t.Button.class;verifyInterface(observer);verifyInterface(observable);verifyInterface(jb);static void verifyInterface(Class c)String name=c.getName();if(c.isInterface()System.out.println(name+是接口.);else System.out.println(name+是类.);程序的输出是java.util.Observer是接口.java.util.Observable 是类.java.awt.Button 是
17、类.,取得类字段,写个程序显示类的名字和所有方法和数据成员,调用Class对象的getFields方法就行了。这个方法返回一个字段对象(Field对象数组)数组,一个对象对应一个字段。如果某个公共字段属于下列情况之一,它就可以被用户存取到属于本类或超类本类实现的接口本类的接口的接口。由Field对象提供的方法允许你取得字段的名字,类型和描述符。你甚至可以给字段赋值或者取字段的值。下面的例子打印了panel类的成员的名字和类型。注意,取成员用了getFields方法,用Field对象的getName取名字,用getType取得某个成员的Class对象,由此判断它的类型。,import java.
18、lang.reflect.*;import java.awt.*;class SampleFieldpublic static void main(String args)Panel g=new Panel();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
19、typeClass=publicFieldsi.getType();String fieldType=typeClass.getName();System.out.println(字段名:+fieldName+,类型:+fieldType);,如果一个类的字段是另一个类对象,输出又会如何呢?请看SampleClassField.javaimport java.lang.reflect.*;public class SampleClassFieldpublic int i=0;public float f=0;public Member mb=new Member(Sam);public Sam
20、pleClassField()System.err.println(start);public static void main(String args)SampleClassField sampleClassField1=new SampleClassField();printFieldNames(sampleClassField1);public static void printFieldNames(Object o)Class c=o.getClass();Field publicFields=c.getFields();for(int i=0;i publicFields.lengt
21、h;i+)String fieldName=publicFieldsi.getName();Class typeClass=publicFieldsi.getType();String fieldType=typeClass.getName();System.out.println(字段名:+fieldName+,类型:+fieldType);class Memberprivate String name;public Member(String n1)name=n1;public String getMember()return name;大家可以看到,类成员是一个对象程序也能输出packa
22、ge名.类名,取得构造方法,构造方法是在创建类对象时调用的特殊方法,构造方法可以重载,由它们的参数加以区别调用getConstructors方法可以取得类构造方法的有关信息。这个方法返回一个数组的Constructor对象。你可以用Constructor对象里的相关方法来确定构造方法的名字,描述符,参数类型和抛出的意外列表。你也可以用Constructor.newInstance创建一个新的Constructor对象下面的例子程序打印出Rectangle类的每个构造方法的参数表,程序是这样执行的。程序用getConstructors方法取得一个数组的Constructor 对象,对于在Cons
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java教学0韩建雷 java反射机制release java 教学 韩建雷 反射 机制 release
链接地址:https://www.31ppt.com/p-6205736.html