反射 类的加载 Schema DOM 解析方式和解析器 命名空间

Day15 反射

 

1.1 类的加载

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

加载

就是指将class文件读入内存,并为之创建一个Class对象。

任何类被使用时系统都会建立一个Class对象

l 连接

验证是否有正确的内部结构,并和其他类协调一致

准备负责为类的静态成员分配内存,并设置默认初始化值

解析将类的二进制数据中的符号引用替换为直接引用

初始化

就是我们以前讲过的初始化步骤  构造方法真正的初始化

1.2 反射概述

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

 

 

 

 

 

 

 

 

 

 

 

 

3.反射_Class对象的初始化时机

1).创建类的实例

Student stu = new Student();

2).第一次使用这个类的静态变量,或者为静态变量赋值

System.out.println(Student.静态变量名);

3).第一次调用类的静态方法

Student.静态方法名();

4).使用反射方式来强制创建某个类或接口对应的java.lang.Class对象【今天讲】

5).第一次初始化某个类的子类

class Person{}

class Student extends Person{}

main(){

Student stu = new Student();//同时也会创建父类对象,在创建父类对象前,会先创建父类的Class对象;

}

6).直接使用java.exe命令来运行某个主类

C:\>java Demo  //创建Demo的Class对象

Day16

 

Schema是新的XML文档约束;

Schema要比DTD强大很多,是DTD 替代者;

Schema本身也是XML文档,Schema文档的扩展名为xsd,而不是xml

Schema 功能更强大,数据类型更完善

Schema 支持名称空间

 

 

 

1.2.1.1.1 2.什么是命名空间

如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.*import java.sql.*时,在使用Date类时,那么就不明确Date是哪个包下的Date了。

总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。

1.2.1 3.解析方式和解析器

开发中比较常见的解析方式有三种,如下

  1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。

a) 优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

b) 缺点:XML文档过大,可能出现内存溢出显现

  1. SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)

a) 优点:处理速度快,可以处理大文件

b) 缺点:只能读,逐行后将释放资源。

  1. PULLAndroid内置的XML解析方式,类似SAX。(了解)

 

l 解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包。

 

 

l 常见的解析开发包:

n JAXPsun公司提供支持DOMSAX开发包

n JDomdom4j兄弟

n jsoup:一种处理HTML特定解析开发包

n dom4j:比较常用的解析开发包,hibernate底层采用。

 

 

 

 

 

 

 

 

 

  1. 反射怎么理解,说一下反射经典的应用

答案:

反射是什么呢?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.java.dbtest.TestConnection");通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!举个例子,使用spring中会发现当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。

posted @ 2018-04-25 15:36  阿善9  阅读(327)  评论(0编辑  收藏  举报