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),例如 类、方法、成员变量,设置验证或者逻辑操作,有没有注解代码都可以被运行,是额外的附加功能

 

简单注解

简单注解由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语句文件

 

 

 

  对应解析代码:

 

 

posted @ 2021-07-30 10:09  二娃千里眼  阅读(55)  评论(0)    收藏  举报