Java JDK 6学习笔记 教学课件 ppt 作者 978-7-302-14995-8 第16章

上传人:E**** 文档编号:89346433 上传时间:2019-05-23 格式:PPT 页数:42 大小:465KB
返回 下载 相关 举报
Java JDK 6学习笔记 教学课件 ppt 作者 978-7-302-14995-8 第16章_第1页
第1页 / 共42页
Java JDK 6学习笔记 教学课件 ppt 作者 978-7-302-14995-8 第16章_第2页
第2页 / 共42页
Java JDK 6学习笔记 教学课件 ppt 作者 978-7-302-14995-8 第16章_第3页
第3页 / 共42页
Java JDK 6学习笔记 教学课件 ppt 作者 978-7-302-14995-8 第16章_第4页
第4页 / 共42页
Java JDK 6学习笔记 教学课件 ppt 作者 978-7-302-14995-8 第16章_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《Java JDK 6学习笔记 教学课件 ppt 作者 978-7-302-14995-8 第16章》由会员分享,可在线阅读,更多相关《Java JDK 6学习笔记 教学课件 ppt 作者 978-7-302-14995-8 第16章(42页珍藏版)》请在金锄头文库上搜索。

1、第16章,反射 类别载入与检视 使用反射生成与操作对象,简介Class与类别载入,真正需要使用一个类别时才会加以加载 java.lang.Class对象代表了Java应用程序在运行时所加载的类别或接口实例 可以透过Object的getClass()方法来取得每一个对象对应的Class对象,或者是透过“class“常量(Classliteral),简介Class与类别载入,String name = “caterpillar“; Class stringClass = name.getClass(); System.out.println(“类别名称:“ + stringClass.getNam

2、e(); 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与类别载入,所谓真正需要通常

3、指的是要使用指定的类别生成对象 例如使用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实例“);,简介Class与类别载入,Class的讯息是在编译时期就被加入至.class档案中 执行时

4、期JVM在使用某类别时,会先检查对应的Class对象是否已经加载 如果没有加载,则会寻找对应的.class档案并载入,简介Class与类别载入,一个类别在JVM中只会有一个Class实例 每个类别的实例都会记得自己是由哪个Class实例所生成 可使用getClass()或.class来取得Class实例,简介Class与类别载入,数组是一个对象,也有其对应的Class实例,System.out.println(boolean.class); System.out.println(void.class); int iarr = new int10; System.out.println(iarr

5、.getClass().toString(); double darr = new double10; 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.

6、lang.reflect.Field,从Class中获取信息,try Class c = Class.forName(args0); 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(arg

7、s0); /取得套件代表对象 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.p

8、rintln(c.getName() + “ “);,从Class中获取信息,/取得宣告的数据成员代表对象 Field fields = c.getDeclaredFields(); for(Field field : fields) /显示权限修饰,像是public、protected、private System.out.print(“t“ + Modifier.toString(field.getModifiers(); /显示型态名称 System.out.print(“ “ + field.getType().getName() + “ “); /显示数据成员名称 System.ou

9、t.println(field.getName() + “;“); ,从Class中获取信息,/取得宣告的建构方法代表对象 Constructor constructors = c.getDeclaredConstructors(); for(Constructor constructor : constructors) /显示权限修饰,像是public、protected、private System.out.print(“t“ + Modifier.toString( constructor.getModifiers(); /显示建构方法名称 System.out.println(“ “

10、+ constructor.getName() + “();“); ,从Class中获取信息,/取得宣告的方法成员代表对象 Method methods = c.getDeclaredMethods(); for(Method method : methods) /显示权限修饰,像是public、protected、private System.out.print(“t“ + Modifier.toString( method.getModifiers(); /显示返回值型态名称 System.out.print(“ “ + method.getReturnType().getName() +

11、 “ “); /显示方法名称 System.out.println(method.getName() + “();“); ,简介类别加载器,Bootstrap Loader通常由C撰写而成 Extended Loader是由Java所撰写而成,实对应sun.misc.Launcher$ExtClassLoader(Launcher中的内部类别) System Loader是由Java撰写而成,实际对应于sun.misc. Launcher$AppClassLoader(Launcher中的内部类别),简介类别加载器,简介类别加载器,BootstrapLoader会搜寻系统参数sun.boot.

12、class.path中指定位置的类别 预设是JRE所在目录的classes下之.class档案,或lib目录下.jar档案中(例如rt.jar)的类别 System.getProperty(“sun.boot.class.path“)显示sun.boot.class.path中指定的路径,简介类别加载器,Extended Loader(sun.misc.Launcher$ExtClassLoader)是由Java撰写而成,会搜寻系统参数java.ext.dirs中指定位置的类别 预设是JRE目录下的libextclasses目录下的.class档案,或libext目录下的.jar档案中(例如r

13、t.jar)的类别 System.getProperty(“java.ext.dirs“)陈述来显示java.ext.dirs中指定的路径,简介类别加载器,System Loader(sun.misc.Launcher$AppClassLoader)是由Java撰写而成,会搜寻系统参数java.class.path中指定位置的类别,也就是Classpath所指定的路径 默认是目前工作路径下的.class档案 System.getProperty(“java.class.path“)陈述来显示java.class.path中指定的路径,简介类别加载器,ootstrapLoader会在JVM启动之

14、后产生,之后它会载入ExtendedLoader并将其parent设为Bootstrap Loader,然後BootstrapLoader再载入SystemLoader并将其parent设定为ExtClassLoader 每个类别加载器会先将加载类别的任务交由其parent,如果parent找不到,才由自己负责载入 载入类别时,会以Bootstrap LoaderExtended LoaderSystemLoader的顺序来寻找类别 都找不到,就会丢出NoClassDefFoundError,简介类别加载器,类别加载器在Java中是以java.lang.ClassLoader型态存在 每一个类

15、别被载入后,都会有一个Class的实例来代表,而每个Class的实例都会记得自己是由哪个ClassLoader载入 可以由Class的getClassLoader()取得载入该类别的ClassLoader,而从ClassLoader的getParent()方法可以取得自己的parent,简介类别加载器,简介类别加载器,/建立SomeClass实例 SomeClass some = new SomeClass(); /取得SomeClass的Class实例 Class c = some.getClass(); /取得ClassLoader ClassLoader loader = c.getCl

16、assLoader(); System.out.println(loader); /取得父ClassLoader System.out.println(loader.getParent(); /再取得父ClassLoader System.out.println(loader.getParent().getParent();,简介类别加载器,取得ClassLoader的实例之后,您可以使用它的loadClass()方法来加载类别 使用loadClass()方法加载类别时,不会执行静态区块 静态区块的执行会等到真正使用类别来建立实例时,简介类别加载器,try System.out.println(“载入TestClass2“); ClassLoader loader = ForNameDemoV3.class.getClassLoader(); Class c = loader.l

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号