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">

 

 

一起学习,一起进步 -.- ,如有错误,可以发评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空城机

有钱捧个钱场,没钱捧个人场

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值