Java基礎(十一)——類加載、反射、XML概述

目錄

類加載

類加載器

反射

獲取class類的對象

反射獲取構造方法並使用

調用方法向數據中添加字符串

XML

 

類加載

進行初始化。如果不出現意外情況,JVM將會連續完成這三個步驟,所以有時也把這三個步驟統稱爲類加載或者類初始化
類的加載

  • 就是指將class文件讀入內存, 併爲之創建一個 java.lang.Class對象
  •  任何類被使用時,系統都會爲之建立一個java.lang.Class對象

類的連接

  • 驗證階段: 用於檢驗被加載的類是否有正確的內部結構,並和其他類協調一致
  • 準備階段:負責爲類的類變量分配內存,並設置默認初始化值
  • 解析階段:將類的二二進制數據中的符號引用替換爲直接引用

類的初始化

  • 在該階段,主要就是對類變量進行初始化

類的初始化步驟

  • 假如類還未被加載和連接, 則程序先加載並連接該類
  • 假如該類的直接父類還未被初始化,則先初始化其直接父類
  • 假如類中有初始化語句,則系統依次執行這些初始化語句

類的初始化時機:

  1. 創建類的實例
  2. 調用類的類方法
  3. 訪問類或者接口的類變量, 或者爲該類變量賦值
  4. 使用反射方式來強制創建某 個類或接口對應的java.lang.Class對象
  5. 初始化某個類的子類
  6. 直接使用java.exe命令來運行某個主類

類加載器

類加載器的作用

  • 負責將.class文件加載到內存中, 併爲之生成對應的java.lang.Class對象
  • 雖然我們不用過分關心類加載機制,但是瞭解這個機制我們就能更好的理解程序的運行

JVM的類加載機制

  • 全盤負責: 就是當一一個類加載器負責加載某個Class時,該Class所依賴的和引用的其他lass也將由該類加載器負責載入,除非顯示使用另外一個類加載器來載入
  • 父類委託:就是當一個類加載器負責加載某個Class時,先讓父類加載器試圖加載該Class,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類
  • 緩存機制:保證所有加載過的Class都會被緩存,當程序需要使用某個Class對象時, 類加載器先從緩存區中搜索該Class,只
  • 有當緩存區中不存在該Class對象時,系統纔會讀取該類對應的二進制數據,並將其轉換成lass對象,存儲到緩存區
public abstract class ClassLoader
extends Object

類加載器是負責加載類的對象。 ClassLoader類是一個抽象類。

 

反射

Java反射機制:是指在運行時去獲取-一個類的變量和方法信息。然後通過獲取到的信息來創建對象,調用方法的一種機制。由於這種動態性,可以極大的增強程序的靈活性,程序不用在編譯期就完成確定,在運行期仍然可以擴展

獲取class類的對象

我們要想通過反射去使用一-個類,首先我們要獲取到該類的字節碼文件對象,也就是類型爲Class類型的對象
這裏我們提供三種方式獲取lass類型的對象

  1. 使用類的class屬性來獲取該類對應的lass對象。 舉例: Student.class將會返回Student類對應的Class對象
  2. 調用對象的getClass0方法,返回該對象所屬類對應的cIass對象
    1. 該方法是Object類中的方法,所有的Java對象都可以調用該方法
  3. 使用Class類中的靜態方法forName(String className), 該方法需要傳入字符串參數,該字符串參數的值是某個類的全路徑,也就是完整包名的路徑

例子:第一種方法最方便

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.使用類的class屬性來獲取該類對應的lass對象
        Class<Student> c1 = Student.class;
        System.out.println(c1);

        Class<Student> c2 = Student.class;
        System.out.println(c2);  //c1是等於c2的
        System.out.println("------");
        //2.調用對象的getClass0方法,返回該對象所屬類對應的cIass對象
        Student s = new Student();
        Class<? extends Student> c3 = Student.class;
        System.out.println(c3);
        System.out.println("------");
        //3.使用Class類中的靜態方法forName(String className)
        Class<?> c4 = Class.forName("cn.itcast.反射.Student");
        System.out.println(c4);
    }
}

結果:

 

反射獲取構造方法並使用

基本數據類型也可以通過.class得到對應的class屬性

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectDemo1 {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<Student> c = Student.class;
        //getConstructors:獲取Student的公共構造方法
//        Constructor<?>[] cons = c.getConstructors();
        //getDeclaredConstructors:獲取Student類全部構造方法
        Constructor<?>[] cons = c.getDeclaredConstructors();
        for(Constructor con : cons){
            System.out.println(con);
        }
        System.out.println("--------");
        //獲取class對象
//        Class<Student> c = Student.class;
        Constructor<Student> con = c.getConstructor(String.class, int.class, String.class);
        //調用對象
        Object obj = con.newInstance("曹操", 50, "許昌");
        System.out.println(obj);
    }
}

結果:

調用方法向數據中添加字符串

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

public class ReflectDemo2 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //創建集合
        ArrayList<Integer> array = new ArrayList<Integer>();
//     array.add(10);
//      arroy.add(20);
//      array.add("hello");

        Class<? extends ArrayList> c = array.getClass();
        Method m = c.getMethod("add",Object.class);
        m.invoke(array,"hello");
        m.invoke(array,"world");
        m.invoke(array,"java");
        System.out.println(array);
    }
}

 

XML

1.概念: Extensible Markup Language 可擴展標記語言
可擴展:標籤都是自定義的。 <user> <student>

2.XML語法較HTML要更加嚴格

XML不是用來展示數據的,而是用來存儲數據

功能:

  1. 配置文件
  2. 在網絡中傳輸

語法:

  1. xml文檔的後綴名. xml
  2. xml第-行必須定義爲文檔聲明
  3. xml文檔中有且僅有一個根標籤
  4. 屬性值必須使用引號(單雙都可)引起來
  5. 標籤必須正確關閉
  6. xml標籤名稱區分大小寫

組成部分:

  1. 文檔說明:
    <?xml version="1.0" encoding="UTF-8" ?>
    1. 格式: <?xml 屬性列表?>
    2. 屬性列表:
      version:版本號,必須的屬性
      encoding:編碼方式
      standalone :是否獨立  yes/no (不依賴於其他文件/依賴於其他文件)
  2. 指令:
    <?xml-stylesheet type="test/css" href="a.css" ?>
  3. 標籤
  4. 屬性
  5. 文本

約束:規定xml文檔的書寫規則
作爲框架的使用者(程序員) :

  • 1.能夠在xml中引入約束文檔
  • 2.能夠簡單的讀懂約束文檔

分類:

  • 1. DTD:一種簡單的約束技術
  • 2. schema: 一種複雜的約束技術

DTD :
引入dtd文檔到xml文檔中

  • 內部dtd :將約束規則定義在xml文檔中
  • 外部dtd :將約束的規則定義在外部的dtd文件中

本地:<!DOCTYPE 根標籤名 SYSTEM "dtd文件的位置">
網絡:<!DOCTYPE 根標籤名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

 

 

一起學習,一起進步 -.- ,如有錯誤,可以發評論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章