What is tE' -“量 import declarations java. io DataOutputStream io. Fil 反射( reflec java. io. File otFoundikcetion spection), 是Java语言 java. io FileOutputStream java. io IOException 的 Class对象获 取类的全音 boolData. boolean 型(类的超类 和实现的捏 o s shor tData.short ta: byt nt 反射可用于a:m a doubleData: double (1)创建类 byteArrayData: byte[] 的结构信息 unsi gnedByteData: int (2)动态创 A testDataOutput FileOutputStream 在使用各种面向对象设计方法都不能实现设 计需求的情况下才使用反射!
What is the reflection? • 反射(reflection)又称为自省(introspection), 是Java语言提供的一种通过类的Class对象获 取类的全部成员和类所属的类型(类的超类 和实现的接口)信息的机制 • 反射可用于实现以下两种功能: (1) 创建类型浏览器,获取类型的结构信息 (2) 动态创建和操作对象 在使用各种面向对象设计方法都不能实现设 计需求的情况下才使用反射!
java. lang Class Class 在Java语言中,类 java. lang,Clas)于表示 类型的定义,也声明了与反射相关的各种方 法 任何类、接口、数组或基本数据类型都提供 了静态的类Clas的对象引用cass String class Cloneable class intlclass double class
java.lang.Class Class • 在Java语言中,类java.lang.Class用于表示 类型的定义,也声明了与反射相关的各种方 法 • 任何类、接口、数组或基本数据类型都提供 了静态的类Class的对象引用class String.class Cloneable.class int[].class double.class
inta={10,100,1000}; Class intArrayClass=a. getclasso inta={10,100,1000}; Class intArrayClass=a class; RUI Class jdbcDriverCls=Class forName(com. mysqljdbc Driver); (用尖b1ec甲的 getclass月 class at public class B{…} Class bClass-=A class. getClasseso 0;
Methods for Class Objects • 获取指定类型的Class对象是进行反射操作的 起点 • 可通过以下4种方法获取类型的Class对象: (1) 调用类Object中的getClass()方法 (2) 访问类型的静态域.class (3) 调用Class.forName(String className)方法 (4) 调用Class对象的getClasses()方法返回嵌套 类或接口的Class对象 int[] a={10,100,1000}; Class intArrayClass=a.getClass(); int[] a={10,100,1000}; Class intArrayClass=a.class; Class jdbcDriverCls=Class.forName(“com.mysql.jdbc.Driver”); class A{ public class B{……} …… } Class bClass=A.class.getClasses()[0];
public void show Kind( Class classobjt if(classObj. isInterfaceo) System. out. printIn("It is an interface type); else if(classobj. isArrayo) System. out. println(“ It is an array type”); else if(class Obj. isPrimitiveO) System. out. printIng(“ It is a primitive type”) else System. out. printIn(“ It is a class type”); show Kind(String class); show Kind (serializable class); show Kind(bytel class); show Kind(int class); It is a class type It is an interface type It is an array type It is a primitive type
Methods for Type Kind • 该类提供了以下方法用于判断Class对象的 类型: public boolean isInterface() public boolean isArray() public boolean isPrimitive() public void showKind(Class classObj){ if(classObj.isInterface()) System.out.println(“It is an interface type”); else if(classObj.isArray()) System.out.println(“It is an array type”); else if(classObj.isPrimitive()) System.out.println(“It is a primitive type”); else System.out.println(“It is a class type”); } showKind(String.class); showKind(Serializable.class); showKind(byte[].class); showKind(int.class); It is a class type It is an interface type It is an array type It is a primitive type
Methods for Type Hierarchy 类 Class声明了以下方法用于获取类的父类 和实现的接口信息 publie ClassI getInterfacesO publie Class getSuper Classe 类Cass声明了以下方法用于获取类的修饰 符信息 public int getModifiersO
Methods for Type Hierarchy • 类Class声明了以下方法用于获取类的父类 和实现的接口信息 public Class[] getInterfaces() public Class getSuperClass() • 类Class声明了以下方法用于获取类的修饰 符信息 public int getModifiers()
Methods for Type Hierarchy 类 Class声明了以下方法用于获取数组元素 的类型信息,非数组类型则返回mull public Class get ComponentTypeO 类 Class声明了以下方法用于获取嵌套类所 在的外层类信息 publie Class getDeclaring Classe
Methods for Type Hierarchy • 类Class声明了以下方法用于获取数组元素 的类型信息,非数组类型则返回null public Class getComponentType() • 类Class声明了以下方法用于获取嵌套类所 在的外层类信息 public Class getDeclaringClass()
public abstract class Outer( public static final class Inner i public class Outer Ext extends Outer( 天 ModIfIer明种衣国 Class c0=OuterExt. class. getSuper Class; int m= cO. getModifiers(; boolean isAbstract= ModifierisAbstract(m); true boolean isPublic= ModifierisPublic(m); true Class cl=c0.get Classeso10l; boolean is Final= Modifier is Final(cl. getModifiersO); true
java.lang.reflect.Modifier Class • java.lang.reflect包定义了各种与反射相关的 类和接口 • 类Modifier声明了各种表示修饰符类型的常 量和判断方法: static final int FINAL static final int PUBLIC static boolean isProtected(int mod) static boolean isVolatile(int mod) public abstract class Outer{ public static final class Inner {……} …… } public class OuterExt extends Outer{ …… } Class c0 = OuterExt.class.getSuperClass(); int m = c0.getModifiers(); boolean isAbstract = Modifier.isAbstract(m); boolean isPublic = Modifier.isPublic(m); Class c1 = c0.getClasses()[0]; boolean isFinal = Modifier.isFinal(c1.getModifiers()); true true true
intl a=new int; A Stringll b=new String 101 boolean c=new boolean 5: Boolean d=new Booleans: System. out. printIn(a. getClasso getNameo); System. out. printIn(b.getClassO-getName0); System. out. printIn(c. getClasso. getNameO) System. out. printIn(d. getclasso-getNameo); LLjavalang String; LLjava lang Boolean;
Array Class Name • 数组的类名由一个或多个左方括号“[”和表示数组 元素类型的字符构成,左方括号“[”的个数表示数 组的维数 B byte C char F float S short Z boolean D double I int L; 类或接口 J long • 类Class声明了以下方法用于获取类型名 public String getName() int[][] a=new int[5][]; String[] b=new String[10]; boolean[] c=new boolean[5]; Boolean[] d=new Boolean[5]; System.out.println(a.getClass().getName()); System.out.println(b.getClass().getName()); System.out.println(c.getClass().getName()); System.out.println(d.getClass().getName()); [[I [Ljava.lang.String; [Z [Ljava.lang.Boolean;
Nested Type Name package test; class Af public class B{…} Class bClass-A classget Classeso10l; System. out. printIn(bClass.getNameo) test.ASB
Nested Type Name • 嵌套类型中成员类型的完全限定名由所属外 层类型的完全限定名和成员类型名构成,中 间用字符“$”分隔 $ package test; class A{ public class B{……} …… } Class bClass=A.class.getClasses()[0]; System.out.println(bClass.getName()); test.A$B
Classes for Class Members Member Constructor Field Method
Classes for Class Members • java.lang.reflect包中定义了用于表示类或接 口的各种成员的类和接口 java.lang.reflect.Member(接口) java.lang.reflect.Constructor(类) java.lang.reflect.Field(类) java.lang.reflect.Method(类) Member Constructor Field Method