JavaSE入门级-第十七课-反射与注解
前言
反射在java中是一个对于初学者是一个比较困难的模块,而且马上应用难度也比较大,这个需要慢慢接受,虽然使用很困难但是也要积极应用在项目中
JVM 类加载
l jvm在执行类的时候算作一个进程,统一进程内的数据变量会被共享,类如何被运行。 类需要先被加载 类被加载需要经过三个步骤,加载,连接,初始化 3 个步骤
ü 加载:jvm通过本地class文件,jar等方式加载
ü 连接:负责把加载的类文件的二进制数合并到JRE中(设置默认值)
ü 初始化:执行静态代码块
l 如下图所示:


ü 类的信息需要被载入到jvm中才能 共享 或 被执行
java.lang.Class 类的类
l 认真观察所有的类都用共同点,比如都有包名,类名,属性,成员,访问修饰符,普通方法,构造方法,这些应该也能被抽象,java规定类的信息应该被抽象成为一个类,就是java.lang.Class
ü 注意:不是关键字 class 区分大小写
l Class类是表示正在运行中的类,它没有显示的构造方法,由虚拟机自动构建,调用类加载器的defineClass方法获得一个class对象
l 代码示例:

反射的定义
l 反射是指在程序的执行过程中,通过获取反射对象 class 而获得对应类的信息,原先我们使用类去获取对象,现在使用对象去获取类,就好比对象照镜子一般,取名 反射
创建对象的多种方式
ü 使用构造器创建对象
ü 通过克隆创建对象
ü 使用反射去创建对象
ü 使用反序列化创建对象
代码示例:

ü 小结:拿到反射对象就等于拿到这个类的一切
new 和 newInstance() 有什么区别
ü new 是关键字,调用构造器,直接创建一个对象,如果jvm没有加载这个类,会加载
ü newInstance() 是反射的方法,获取的对象是Object,前提jvm必须加载这个类,如果没有会报错,而且创建的数据是弱引用,容易被GC回收,只能创造空对象
反射常用API
l 一个类被加载后(只会被加载一次),jvm会将类按照一定规则保管起来(注册)
ü java.lang.reflect.Constructor 包含class对象所对应的类 的构造方法信息
ü java.lang.reflect.Filed 包含class对象所对应的类 的成员属性信息
ü java.lang.refilect.Method 包含class对象所对应的类 的方法属性信息
基本可以分为,构造器部分,属性成员部分,方法部分,注解部分,基本信息
基本信息
示例代码:

常用方法

构造器信息
示例代码:

常用方法:

属性成员信息
示例代码:

常用方法:

方法信息
代码示例

常用方法:

java.lang.reflect
l 针对于数组的反射操作(这里不多做介绍)
练习:(难)
l 在数据库列名、类属性名一致的前提下,完成查询DAO操作,加入反射实现自动封装
- 传入反射对象作为实体类信息
- 使用 newInstance 创建空对象
- 调用set方法完成赋值
Annotation注解
l Annotation代码里的特殊标记,这些标记可以在编译、类加载、运行的时候被 扫描 读取,研发人员可以在不改变源代码的前提下对源文件做一些补充信息,编译器会对这些标记进行 验证 或者 额外操作
l Annotation被用来为程序元素(metadata),例如 类、方法、成员变量,设置验证或者逻辑操作,有没有注解代码都可以被运行,是额外的附加功能
简单注解
l 简单注解由JDK提供
ü @Override 标记方法,校验方法是否符合重写的标准
ü @Deprecated 标记类和方法,表示该类和方法已过时
ü @SuppressWarnings 标记程序元素,表示压制编译器的警告
自定义注解
l 自定义注解使用 @interface 关键字
代码示例:

元注解
l jdk提供加载注解上的注解
例如:上图中 @Target,@Retention,都是标在注解MyAannotation上就是元注解
Introspector内省
l 内省是针对javabean的操作,javabean是一类标准的java类
举例:java类中有某个属性,那么我们需要通过反射调用setXXX 或者 getXXX去访问对应属性,不建议开挂访问,内省可以更之间简单一些
代码示例:


内省也提供类更方便的java包

XML文档解析
l EXtensible Markup Language XML,特别注意带ML结尾的都是标记语言,它的特点就是由成套的标签出现,而且往往都会有解析器,自动解析
l xml极其简单它设计的意图是用来做数据传输,数据传输还有另外一种载体json
java读取xml文件
l dom解析:和平台语言无关,解析整个xml文件,成为树或者对象在提供访问操作
l sax解析:不需要将数据存储在内存中,不需要解析整个文档,在解析到满足条件时停止继续解析,事件驱动,一个节点一个节点的访问,每次都要
l jdom解析:基于dom解析,这个支持是Java特点的模型,写起来简单
l DOM4解析:基于dom解析,是jdom的一个升级版
jdom解析XML
l 导入对应包
代码示例:
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(new File("src\\student.xml"));
Element student = doc.getRootElement();
List<Element> propList = student.getChildren();
for(Element e:propList) {
System.out.println(e.getName()); // 获取tag的名称
System.out.println(e.getText()); // 获取tag内文本
System.out.println(e.getAttributeValue("value")); // 获取tag内属性的值
}
XML解析实现SQL载入
xml语句文件

对应解析代码:


浙公网安备 33010602011771号