day03Java基础加强课件

上传人:沈*** 文档编号:175661653 上传时间:2022-12-20 格式:PPT 页数:47 大小:3.77MB
收藏 版权申诉 举报 下载
day03Java基础加强课件_第1页
第1页 / 共47页
day03Java基础加强课件_第2页
第2页 / 共47页
day03Java基础加强课件_第3页
第3页 / 共47页
资源描述:

《day03Java基础加强课件》由会员分享,可在线阅读,更多相关《day03Java基础加强课件(47页珍藏版)》请在装配图网上搜索。

1、高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强北京传智播客教育 就业方向就业方向JavaWebAndroidJavaEEXMLXMLServletServlet JSPJSP DBDBJDBCJDBCMailMailJavaJavaHTMLHTMLJavaScriptJavaScriptStrutsStrutsSpringSpringHibernateHibernate嵌入式开发嵌入式开发手机手机智能终端智能终端高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强JavaJava基础加强基础加强焦宁波焦宁波高级软件人才实作培训专家高级软件人

2、才实作培训专家!day03Java基础加强Eclipse的使用l工作空间(workspace)、工程(project)l在eclipse下Java程序的编写和运行,及java运行环境的配置。l快捷键的配置,常用快捷键:内容提示:Alt+/快速修复:Ctrl+1导包:Ctrl+shift+O格式化代码块:ctrl+shift+F删除一行:Ctrl+D添加注释:Ctrl+Shift+/Ctrl+/除去注释:Ctrl+Shift+Ctrl+/l程序的调试和运行(写数组反序输出程序演示)F5(跳入)F6(跳过)F7(跳出)案例lJUnit(Java 单元测试)高级软件人才实作培训专家高级软件人才实作培

3、训专家!day03Java基础加强JDK 5.0 新特性lJDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效、清晰,安全的代码。静态导入自动装箱/拆箱增强for循环可变参数枚举 反射 内省泛型元数据高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强静态导入静态导入lJDK 1.5 增加的静态导入语法用于导入类的某个静态属性或方法。使用静态导入可以简化程序对类静态属性和方法的调用。l语法:import static 包名.类名.静态属性|静态方法|*l例如:import static java.lang.System.outimport

4、static java.lang.Math.*l案例案例求圆的面积、任意半径圆的面积高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强自动装箱自动装箱/拆箱拆箱lJDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量,或者赋给 Object 类型的变量,这个过程称之为自动装箱。l自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量。l典型应用:List list=new ArrayList();list.add(1);int j=(Integer)list.get(0);高级软件人才实作培训专家高级软件人才实作培训专家!day03

5、Java基础加强Wrapper Class包装类包装类Byte Short Integer Long Boolean CharacterFloat Double 基本类型基本类型byte short int long boolean charfloat double 装箱装箱拆箱拆箱Auto思考:思考:String str=“itcast”;是否是自动装箱?高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强增强for循环l引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦!l因此JDK5中定义了一种新的

6、语法增强for循环,以简化此类操作。增强for循环只能用在数组数组、或实现实现Iterable接口接口(Set/List)的集合类上。l语法格式:for(变量类型 变量:需迭代的数组或集合)高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强增强for循环l使用增强for循环的几个注意事项(以下程序的输出结果?)int arr=new int5;for(int num:arr)num=1;System.out.println(arr0);List list=new ArrayList();list.add(xxx);for(String str:list)str=yyy

7、;System.out.println(list.get(0);l增强for循环在迭代集合时必须使用范型,否则就只能采用Object接收。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强可变参数l测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组,传数组又传参的情况。public static List asList(T.a)注意:注意:传入基本数据类型数组的问题。l从JDK 5开始,Java 允许为方法定义长度可变的参数。语法:public void foo(int args)l注意事项:注意事项:调用可变参数的方法时,编译器将自

8、动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数。可变参数只能处于参数列表的最后,所以一个方法最多只能有一个长度可变的参数。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强枚举类l为什么需要枚举?一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。举例 交通灯(红、黄、绿)性别(男、女)星期(星期一、二、三.)分数等级(A、B、C、D、E)lJDK 5新增的 enum 关键字用于定义一个枚举类。高级软件人才实作培训专

9、家高级软件人才实作培训专家!day03Java基础加强枚举类l枚举的实现使用enum定义枚举类在枚举类中定义枚举值(大写)l枚举类具有如下特性:枚举类也是一种特殊形式的Java类。枚举类中声明的每一个枚举值代表枚举类的一个实例对象。与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。枚举类也可以实现接口(序列化)、或继承抽象类。JDK5中扩展了swith语句,它除了可以接收int,byte,char,short外,还可以接收一个枚举类型(enum)。若枚举类只有一个枚举值,则可以当作单态设计模式使用。l练习:请编写一个关于星

10、期几的枚举WeekDay,要求:枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 该枚举要有一个方法,调用该方法返回中文格式的星期。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强枚举类lJava中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:name()返回枚举常量的nameordinal()返回枚举常量的声明索引valueof(Class enumClass,String name)返回指定名称的枚举类values()此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举

11、值非常方便。注意:注意:JDK API文档中并不是包含了所有类、所有类的方法、字 段,没有被API收录的类、方法、字段是SUN公司内部使用的,开 发人员如果知道,也可以使用。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强反射反射(Reflect)(Reflect)l什么是反射?反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:包、成员变量、方法、构造方法等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成与之相对应的对象。l反射用在哪里?框架l学习反射应该掌握些什么?获取类的字节码、构造器、方法、字段对象的方法和使用。高级软件

12、人才实作培训专家高级软件人才实作培训专家!day03Java基础加强ClassClass类类lClass类用于表示.class文件,画图演示一个对象的创建过程。l如何得到某个class文件对应的class对象。类名.class,知道类名对象.getClass()Class.forName(“类名”)推荐使用推荐使用l数组类型的Class实例对象Class.isArray()Class.isEnum()l总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int,void高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强ConstructorConst

13、ructor类类lConstructor类的实例对象代表类的一个构造方法。类的实例对象代表类的一个构造方法。l得到某个类所有的得到某个类所有的公共构造方法公共构造方法,例:,例:Constructor constructors=Class.forName(java.lang.String).getConstructors();l得到某个类得到某个类所有的构造方法所有的构造方法,例:,例:Constructor constructors=Class.forName(java.lang.String).getDeclaredConstructors()l得到得到某一个构造方法某一个构造方法,例:,

14、例:Constructor constructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);l利用构造方法创建实例对象:利用构造方法创建实例对象:String str=(String)constructor.newInstance(“abc”);lClass类的类的newInstance()方法也可创建类的实例,其内部工作原理是先得无方法也可创建类的实例,其内部工作原理是先得无参的构造方法,再用构造方法创建实例对象。参的构造方法,再用构造方法创建实例对象。String obj=(String)Cl

15、ass.forName(java.lang.String).newInstance();高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强FieldField类类lField类类代表某个类中的一个成员变量l问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,那关联的是哪个对象呢?所以字段Field x 代表的是x的定义,而不是具体的x变量。(注意访问权限的问题)l示例代码:ReflectPoint point=new ReflectPoint(1,7);Field y=Class.for

16、Name(cn.itcast.corejava.ReflectPoint).getField(y);System.out.println(y.get(point);/Field x=Class.forName(cn.itcast.corejava.ReflectPoint).getField(x);Field x=Class.forName(cn.itcast.corejava.ReflectPoint).getDeclaredField(x);x.setAccessible(true);/获取私有属性获取私有属性 暴力反射暴力反射 x.setInt(new User(),345);Syste

17、m.out.println(x.get(point);高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强MethodMethod类类lMethod类类代表某个类中的一个成员方法l得到类中的某一个方法:例子:Method charAt=Class.forName(java.lang.String).getMethod(charAt,int.class);l调用方法:通常方式:System.out.println(str.charAt(1);反射方式:System.out.println(charAt.invoke(str,1);注意:注意:如果传递给Method对象的i

18、nvoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法!ljdk1.4和jdk1.5的invoke方法的区别:Jdk1.5:public Object invoke(Object obj,Object.args)Jdk1.4:public Object invoke(Object obj,Object args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke(“str”,new Ob

19、ject1)形式。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强用反射方式执行某个类中的用反射方式执行某个类中的mainmain方法方法l目标:目标:写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普通方式调完后,大家要明白为什么要用反射方式去调啊?l问题:问题:启动Java程序的main方法的参数是一个字符串数组,即public static void main(String args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法,数组中的每个

20、元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String“xxx”),javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。l解决办法:解决办法:mainMethod.invoke(null,new Objectnew Stringxxx);mainMethod.i

21、nvoke(null,(Object)new String“xxx”);编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干个参数了。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强内省(Introspector)JavaBeanl什么是JavaBean和属性的读写方法?l访问JavaBean属性的两种方式:直接调用bean的setXXX或getXXX方法。通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式。通过PropertyDescriptor类操作Bean的属性通过Introspector类获得Bean

22、对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强方式一方式一User u=new User();PropertyDescriptor pd=new PropertyDescriptor(x,User.class);Method m=pd.getWriteMethod();m.invoke(u,348);Method re=pd.getReadMe

23、thod();System.out.println(re.invoke(u);高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强方式二方式二User u=new User();BeanInfo info=Introspector.getBeanInfo(User.class);PropertyDescriptor pd =info.getPropertyDescriptors();for(PropertyDescriptor temp:pd)String name=temp.getName();System.out.println(name);高级软件人才实作培训专家

24、高级软件人才实作培训专家!day03Java基础加强内省beanutils工具包 lApache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写。lBeanutils工具包的常用类:BeanUtils 有默认的转型机制 PropertyUtils.copyProperties(dest,src)属性拷贝ConvertUtils.regsiter(Converter convert,Class clazz)自定义转换器(常用转换器)l案例案例属性设置属性拷贝高级软件人才实

25、作培训专家高级软件人才实作培训专家!day03Java基础加强JavaSE中的路径问题l相对路径l绝对路径lClass类 getResource(String name)getResourceAsStream(String name)获取相对路径。如果要取得一个非相对路径下的资源,那么必须使用绝对路径。File(“绝对路径”)高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强泛型(Generic)泛形的作用(重点)lJDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题。例如:ArrayList

26、 list=new ArrayList();list.add(abc);Integer num=(Integer)list.get(0);/运行时会出错,但编码时发现不了list.add(new Random();list.add(new ArrayList();for(int i=0;ilist.size();i+)(?)list.get(i);/此处取出来的对象应转换成什么类型高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强泛型(Generic)泛形的作用lJDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为

27、编译时的把原来程序运行时可能发生问题,转变为编译时的问题问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。l注意:注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。l泛形的基本术语,以ArrayList为例:念着typeofArrayList中的E称为类型参数变量ArrayList中的Integer称为实际类型参数整个称为ArrayList泛型类型整个ArrayList称为参数

28、化的类型ParameterizedType 高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强泛型典型应用l使用迭代器迭代泛形集合中的元素。l使用增强for循环迭代泛形集合中的元素。l存取HashMap中的元素。l使用泛形时的几个常见问题:使用泛形时,泛形类型须为引用类型,不能是基本数据类型ArrayList list=new ArrayList();ArrayList list=new ArrayList();ArrayList list=new ArrayList();ArrayList list=new ArrayList();ArrayList list=ne

29、w ArrayList();高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强自定义泛形泛型方法lJava程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:,T可以是任意字母,但通常必须要大写。通常需放在方法的返回值声明之前。例如:public static void doxx(T t);l练习:编写一个泛形方法,实现数组元素的交换。编写一个泛形方法,接收一个任意数组,并颠倒数组中的所有元素。l注意:只有对象类型才能作为泛型方法的实际参数。int在泛型中可以同时有多个类型,例如:public static V getVal

30、ue(K key)return map.get(key);高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强自定义泛形泛型类和反射泛形l如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:public class GenericDao private T field1;public void save(T obj)public T getId(int id)l注意,静态方法不能使用类定义的泛形,而应单独定义泛形。l泛形的典型应用:BaseDao和反射泛型高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强

31、泛型的高级应用通配符l定义一个方法,接收一个集合,并打印出集合中的所有元素,如下所示:void print(Collection c)for(Object e:c)System.out.println(e);l问题:该方法只能打印保存了Object对象的集合,不能打印其它集合。通配符用于解决此类问题,方法的定义可改写为如下形式:void print(Collection c)/Collection(发音为:collection of unknown)for(Object e:c)System.out.println(e);l此种形式下需要注意的是:由于print方法c参数的类型为Collect

32、ion,即表示一种不确定的类型,因此在方法体内不能调用与类型相关的方法,例如add()方法。l总结:使用?通配符主要用于引用对象,使用了?通配符,就只能调对象与类型无关的方法,不能调用对象与类型有关的方法。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强泛型的高级应用有限制的通配符l限定通配符的上边界:正确:Vector x=new Vector();错误:Vector x=new Vector();l限定通配符的下边界:正确:Vector x=new Vector();错误:Vector x=new Vector();public void add(List li

33、st)list.add(abc);l问题:以下代码行不行?高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强练习l枚举的练习(见前PPT)l反射user.propertiesclass=“”constructor=“”name=“”method=“”User类类l通过反射机制实现实例的创建,属性、方法的访问高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强Annotation(注解)概述(重点)l从 JDK 5.0 开始,Java 增加了对元数据(MetaData)的支持,也就是 Annotation(注解)。l什么是Annotation,以

34、及注解的作用?三个基本的 Annotation:Override:限定重写父类方法,该注解只能用于方法Deprecated:用于表示某个程序元素(类,方法等)已过时SuppressWarnings:抑制编译器警告.lAnnotation 其实就是代码里的特殊标记,它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。l掌握注解技术的要点:如何定义注解如何反射注解,并根据反射的注解信息,决定如何去运行类高级软件人才实作培训专家高级软件人才实作培

35、训专家!day03Java基础加强自定义 Annotationl定义新的 Annotation 类型使用 interface 关键字l声明注解的属性注解属性的作用:原来写在配置文件中的信息,可以通过注解的属性进行描述。属性的类型可以是String/基本类型/枚举/类/注解/数组Annotation 的属性声明方式:String name();属性默认值声明方式:String name()default“xxx”;特殊属性value:如果注解中有一个名称value的属性,那么使用注解时可以省略value=部分,如MyAnnotation(“xxx)特殊属性value;高级软件人才实作培训专家高级

36、软件人才实作培训专家!day03Java基础加强JDK 的元 Annotationl元 Annotation指修饰Annotation的Annotation。JDK中定义了如下元Annotation:lRetention:只能用于修饰一个 Annotation 定义,用于指定该 Annotation 可以保留的域,Rentention 包含一个 RetentionPolicy 类型的成员变量,通过这个变量指定域。RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注释RetentionPolicy.CLASS:编译器将把注解记录在 class 文件中.当运行 Java 程序时

37、,JVM 不会保留注解.这是默认值RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中.当运行 Java 程序时,JVM 会保留注解.程序可以通过反射获取该注释高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强JDK 的元 Annotation 2lTarget:指定注解用于修饰类的哪个成员.Target 包含了一个名为 value,类型为ElementType的成员变量。lDocumented:用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.lInherited:被它修饰

38、的 Annotation 将具有继承性.如果某个类使用了被 Inherited 修饰的 Annotation,则其子类将自动具有该注解高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强提取 Annotation 信息lJDK 5.0 在 java.lang.reflect 包下新增了 AnnotationElement 接口,该接口代表程序中可以接受注释的程序元素l当一个 Annotation 类型被定义为运行时 Annotation 后,该注释才是运行时可见,当 class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取l程序可以调

39、用 AnnotationElement 对象的如下方法来访问 Annotation 信息高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强北京传智播客教育 TipTip:动态代理:动态代理l明确两个概念:代理对象存在的价值:主要用于拦截对真实业务对象的访问。代理对象有什么方法?l现在要生成某一个对象的代理对象,这个代理对象通常也要编写一个类来生成,所以首先要编写用于生成代理对象的类。l如何编写生成代理对象的类,两个要素:代理谁如何生成代理对象l代理谁?设计一个类变量,以及一个构造函数,记住代理类 代理哪个对象。l如何生成代理对象?设计一个方法生成代理对象(在方法内编写

40、代码生成代理对象是此处编程的难点)高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强北京传智播客教育 TipTip:动态代理:动态代理 lJava提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,使用该方法生成代理对象时,需要三个参数:1.生成代理对象使用哪个类装载器2.生成哪个对象的代理对象,通过接口指定3.生成的代理对象的方法里干什么事,由开发人员编写handler接口的实现来指定。l初学者必须理解,或不理解必须记住的2件事情:Proxy类负责创建代理对象时,如果指定了handler(处理器),那么不管用户调用代理对象的什么方法

41、,该方法都是调用处理器的invoke方法。由于invoke方法被调用需要三个参数:代理对象、方法、方法的参数,因此不管代理对象哪个方法调用处理器的invoke方法,都必须把自己所在的对象、自己(调用invoke方法的方法)、方法的参数传递进来。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强北京传智播客教育 TipTip:动态代理:动态代理代理类public Object invoke(Object proxy,Method method,Object args)doSomething.void run(“aaa”)void eat(“bbb”)invoke(thi

42、s,run,”aaa”)invoke(this,eat,”bbb”)处理器代理对象void run(“aaa”)void eat(“bbb”)被代理对象高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强北京传智播客教育 TipTip:动态代理应用:动态代理应用l在动态代理技术里,由于不管用户调用代理对象的什么方法,都是调用开发人员编写的处理器的invoke方法(这相当于invoke方法拦截到了代理对象的方法调用)。l并且,开发人员通过invoke方法的参数,还可以在拦截的同时,知道用户调用的是什么方法,因此利用这两个特性,就可以实现一些特殊需求,例如:拦截用户的访问请

43、求,以检查用户是否有访问权限、动态为某个对象添加额外的功能。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强类加载器l类加载器负责将.class 文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的 java.lang.Class 对象l当 JVM 启动时,会形成由三个类加载器组成的初始类加载器层次结构:高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强类加载器之间的父子关系和管辖范围图BootStrapExtClassLoaderAppClassLoaderItcastClassLoaderMyClassLoaderSyst

44、emclassLoaderJRE/lib/rt.jarJRE/lib/ext/*.jarCLASSPATH指定的所有jar或目录传智播客指定的特殊目录高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强bootstrap classloaderlbootstrap classloader:引导(也称为原始)类加载引导(也称为原始)类加载器器,它负责加载它负责加载Java的核心类的核心类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。可以通过执行以下代码来获得bootstrap classloader加载

45、了那些核心类库:l因为JVM在启动的时候就自动加载它们,所以不需要在系统属性CLASSPATH中指定这些类库URL urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();for(int i=0;i urls.length;i+)System.out.println(urlsi.toExternalForm();高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强extension classloaderextension classloaderlextension classloader 扩展类加载器扩展类加载

46、器,它负责加载它负责加载JRE的扩展目录(的扩展目录(JAVA_HOME/jre/lib/ext或者由或者由java.ext.dirs系统属性指定的)中的系统属性指定的)中的JAR包包。这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的 JAR类包对所有的JVM和system classloader都是可见的。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强system classloadersystem classloaderlsystem classloader 系统(也称为

47、应用)类加系统(也称为应用)类加载器,它负责在载器,它负责在JVM被启动时,加载来自在命令被启动时,加载来自在命令java中的中的-classpath或者或者java.class.path系统属系统属性或者性或者 CLASSPATH操作系统属性所指定的操作系统属性所指定的JAR类包和类路径。类包和类路径。l可以通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。高级软件人才实作培训专家高级软件人才实作培训专家!day03Java基础加强全盘负责委托机制全盘负责委托机制 lcl

48、assloader 加载类用的是全盘负责委托机制全盘负责委托机制。l全盘负责:全盘负责:即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的其它Class通常通常也由这个classloader负责载入。l委托机制委托机制:先让parent(父)类加载器 寻找,只有在只有在parent找不到的时候才从自己的类路径中去寻找找不到的时候才从自己的类路径中去寻找。l类加载还采用了类加载还采用了cache机制:机制:如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么修改了Class但是必须重新启动JVM才能生效,并且类只加载一次的原因。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!