第16章 反射 类别载入与检视 使用反射生成与操作对象
第16章 • 反射 – 类别载入与检视 – 使用反射生成与操作对象
简介Cass与类别载人 真正需要使用一个类别时才会加以加载 java. lang Class对象代表了Java应用程序在 运行时所加载的类别或接口实例 可以透过○ eject的 getclass(0方法来取得每 个对象对应的Cass对象,或者是透过 class"常量( Classliteral
简介Class与类别载入 • 真正需要使用一个类别时才会加以加载 • java.lang.Class对象代表了Java应用程序在 运行时所加载的类别或接口实例 • 可以透过Object的getClass()方法来取得每 一个对象对应的Class对象,或者是透过 "class"常量(Classliteral)
简介C|ass与类别载人 string name caterpillar i Class stringclass =name getClass() System.out. print1n("类别名称:"+ stringClass. getName()) System.out. print1n("是否为接口:"+ stringclass. isInterface ())i System.out. println("是否为基本型态:"+ stringclass imPrimitive())i System.out. print1n("是否为数组对象:"+ stringclass. isArray() System.out. print1n("父类别名称:"+ stringclass. getSuperclass().getName())i Class stringclass String class
简介Class与类别载入 String name = "caterpillar"; Class stringClass = name.getClass(); System.out.println("类别名称:" + stringClass.getName()); System.out.println("是否为接口:" + stringClass.isInterface()); System.out.println("是否为基本型态:" + stringClass.isPrimitive()); System.out.println("是否为数组对象:" + stringClass.isArray()); System.out.println("父类别名称:" + stringClass.getSuperclass().getName()); Class stringClass = String.class;
简介 Class与类别载入 所谓「真正需要」通常指的是要使用指定 的类别生成对象 例如使用 Class. forNameo加载类别’或是 使用 Classloader的 Jloadclass0载人类别 public class TestClass i tatic i System.out. println("类别被载人") TestClass test null System.out. print1n("宣告 Tes tc1ass参考名称") test new Testclass( System.out. print1n("生成 Tes tc1ass实例");
简介Class与类别载入 • 所谓「真正需要」通常指的是要使用指定 的类别生成对象 • 例如使用Class.forName()加载类别,或是 使用ClassLoader的loadClass()载入类别 public class TestClass { static { System.out.println("类别被载入"); } } TestClass test = null; System.out.println("宣告TestClass参考名称"); test = new TestClass(); System.out.println("生成TestClass实例");
简介C|ass与类别载人 Class的讯息是在编译时期就被加入 至.c!ass档案中 ·执行时期JVM在使用某类别时,会先检查 对应的Cass对象是否已经加载 如果没有加载,则会寻找对应的c!ass档案 并载人
简介Class与类别载入 • Class的讯息是在编译时期就被加入 至.class档案中 • 执行时期JVM在使用某类别时,会先检查 对应的Class对象是否已经加载 • 如果没有加载,则会寻找对应的.class档案 并载入
简介Cass与类别载入 一个类别在JM中只会有一个Cass实例 每个类别的实例都会记得自己是由哪个 Cass实例所生成 可使用 getClass0或cass来取得 Class实例 class java. lang String getc|ass0 String物件 stng物件9ecas9 String物件 getclass
简介Class与类别载入 • 一个类别在JVM中只会有一个Class实例 • 每个类别的实例都会记得自己是由哪个 Class实例所生成 • 可使用getClass()或.class来取得Class实例
简介C|ass与类别载人 数组是一个对象,也有其对应的Cas实例 System. out. println(boolean class)i System. out. println(void. class)i int[] iarr new int [10]i System. out. println(iarr getClass(). tostring()) double[ darr new double [10] System. out. println(darr. getclass(). tostring()) boolean void class [i class [d
简介Class与类别载入 • 数组是一个对象,也有其对应的Class实例 System.out.println(boolean.class); System.out.println(void.class); int[] iarr = new int[10]; System.out.println(iarr.getClass().toString()); double[] darr = new double[10]; System.out.println(darr.getClass().toString()); boolean void class [I class [D
从 Class中获取信息 Class对象表示所加载的类别,取得 Class 对象之后,您就可以取得与类别相尖联的 信 套件的对应型态是 java. lang Package 建构方法的对应型态是 java. lang reflect Constructor 方法成员的对应型态是 java. lang. reflect Method 数据成员的对应型态是 java. lang reflect Field
从Class中获取信息 • Class对象表示所加载的类别,取得Class 对象之后,您就可以取得与类别相关联的 信息 – 套件的对应型态是java.lang.Package – 建构方法的对应型态是 java.lang.reflect.Constructor – 方法成员的对应型态是 java.lang.reflect.Method – 数据成员的对应型态是java.lang.reflect.Field
从 Class中获取信息 ry Class c =Class forName(args[o])i Package p =c. getPackage()i System. out. println(p getName())i catch(Array IndexOutofBoundsException e) System.out. print1n("没有指定类别"); catch(ClassNotFoundException e)t System.out. print1n("找不到指定类别")
从Class中获取信息 try { Class c = Class.forName(args[0]); Package p = c.getPackage(); System.out.println(p.getName()); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("没有指定类别"); } catch(ClassNotFoundException e) { System.out.println("找不到指定类别"); }
从 Class中获取信息 Class c= Class. forName(args[o]) //取得套件代表对象 Package p getPackage( System. out. printf( package sion",p getName())i //取得型态修饰’像是c1ass丶 interface nt m retModifiers ( System. out.print(Modifier tostring(m)+)i //如果是接口 if(Modifier. isInterface(m)) System. out. print(interface)i e⊥se System. out. print (" class )i System. out. println(c getName()+ f")
从Class中获取信息 Class c = Class.forName(args[0]); //取得套件代表对象 Package p = c.getPackage(); System.out.printf("package %s;%n", p.getName()); //取得型态修饰,像是class、interface int m = c.getModifiers(); System.out.print(Modifier.toString(m) + " "); //如果是接口 if(Modifier.isInterface(m)) { System.out.print("interface "); } else { System.out.print("class "); } System.out.println(c.getName() + " {");