• 反射 类的加载 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容器就会根据你的需求去动态加载,你的程序就能健壮地运行。

  • 相关阅读:
    Neutron分析(5)—— neutron-l3-agent中的iptables
    Neutron分析(4)—— neutron-dhcp-agent
    Neutron分析(3)—— neutron-l3-agent
    Neutron分析(2)——neutron-server启动过程分析
    Neutron分析(1)——简介
    RDO部署openstack(3)
    RDO部署openstack(2)
    Peewee之playhouse中的数据库连接池(原创)
    图数据库简介(转)
    RESTful API 最佳实践(转)
  • 原文地址:https://www.cnblogs.com/shan1393/p/8945144.html
Copyright © 2020-2023  润新知