一、反射
1.1 反射是什么
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
1.2 反射的作用
在程序运行时获取类的信息,和执行相关的内容。
应用场景:
1.jdbc
2.框架-mybatis、spring等等
3.工具 beanutil、fastjson等
1.3 反射的使用
反射API用来生成JVM中的类、接口或则对象的信息。
- Class类:反射的核心类,可以获取类的属性,方法等信息。
- Field类:Java.lang.reflec包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
- Method类: Java.lang.reflec包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
- Constructor类: Java.lang.reflec包中的类,表示类的构造方法。
public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException {
//获取Class对象
Class<User> clz=User.class;
//实例化对象
User user= clz.newInstance();
System.err.println(user);
//获取属性
Field[] arr=clz.getDeclaredFields();//获取类中定义的属性
// Field[] arr=clz.getFields();//获取所有公共属性
for(Field f:arr){
System.err.println(f.getName());
if(f.getName().equals("name")) {
//为属性赋值-忽略访问权限
f.setAccessible(true);
f.set(user, "12");
}
}
System.err.println(user);
Method[] arrM=clz.getDeclaredMethods();//获取类中定义的方法-私有
//Method[] arrM=clz.getMethods();//获取类中的方法-所有公共
for(Method m:arrM){
System.err.println(m.getName());
if(m.getName().equals("show")){
//执行方法
m.setAccessible(true);
m.invoke(user);
}
//获取方法上的注解
// Override o= m.getAnnotation(Override.class);
// System.err.println(m.getName()+"----"+o);
}
}
二、注解
2.1 注解是什么
Java注解(Annotation)又称Java标注,是JDK5.0之后的一种注释机制,用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行。
注解的本质就是一个Annotation接口
2.2 注解的作用
五大元注解:作用在其他注解的注解:
@Retention-标识这个注释解怎么保存,是只在代码中,还是编入类文件中,或者是在运行时可以通过反射访问。使用枚举RetentionPolicy来表示注解保留时期,
RetentionPolicy.SOURCE:注解仅存在于源码中,在class字节码文件中不包含
RetentionPolicy.CLASS:默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
RetentionPolicy.RUNTIME:注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Documented-标记这些注解是否包含在用户文档中,是能够将注解中的元素包含到 Javadoc 中去
@Target-标记这个注解应该是一名Java成员,注解作用的范围就比较具体了,可以是类,方法,方法参数变量等,同样也是通过枚举类ElementType表达作用类型
@Target(ElementType.TYPE) 作用接口、类、枚举、注解
@Target(ElementType.FIELD) 作用属性字段、枚举的常量
@Target(ElementType.METHOD) 作用方法
@Target(ElementType.PARAMETER) 作用方法参数
@Target(ElementType.CONSTRUCTOR) 作用构造函数
@Target(ElementType.LOCAL_VARIABLE)作用局部变量
@Target(ElementType.ANNOTATION_TYPE)作用于注解(@Retention注解中就使用该属性)
@Target(ElementType.PACKAGE) 作用于包
@Target(ElementType.TYPE_PARAMETER) 作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)
@Target(ElementType.TYPE_USE) 类型使用.可以用于标注任意类型除了 class (jdk1.8加入)
@Inherited-标记这个注解是继承于该注解类(替代注解并没有继承于任何子类),一个被@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
@Repeatable(JDK1.8加入)被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。
1.提供信息给编译器: 编译器可以利用注解来检测出错误或者警告信息,打印出日志。
2.编译阶段时的处理: 软件工具可以用来利用注解信息来自动生成代码、文档或者做其它相应的自动处理。
3.运行时处理: 某些注解可以在程序运行的时候接受代码的提取,自动做相应的操作。
4.实现APT(Annotation Processing Tool),注解能够提供元数据
2.3 自定义注解实现
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD}) //作用范围
@Retention(RetentionPolicy.RUNTIME) //保存方案,运行时 反射
public @interface MyZhuJie {
//属性---
String value() default "默认内容";
int version();
}
@MyZhuJie(version =1,value = "这是学生类")
public class Student {
@MyZhuJie(version = 2,value = "姓名")
private String name;
}
public static void main(String[] args) throws NoSuchFieldException {
Class clz=Student.class;
//反射-获取注解
//获取类上的注解
Annotation myZhuJie=clz.getAnnotation(MyZhuJie.class);
if(myZhuJie!=null && myZhuJie instanceof MyZhuJie){
MyZhuJie m=(MyZhuJie)myZhuJie;
System.err.println(m.value()+"---->"+m.version());
}
//获取属性上的注解
Field field=clz.getDeclaredField("name");
MyZhuJie mf=field.getAnnotation(MyZhuJie.class);
System.err.println(mf.value()+"--->"+mf.version());
}
三、JSON
3.1 JSON是什么
JSON:(JavaScript Object Notation),是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。
特点:
1.跨语言
2.跨网络
3.跨平台
JSON
3.2 JSON的语法格式
JSON是一个序列化的对象或数组。
字符串(在双引号中)、数组(在中括号中)、数字(整数或浮点数)、逻辑值(true 或 false)、对象(在大括号中)、 null。
四、XML
4.1 XML是什么
xml(eXtensible Markup Language)是一种用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据
4.2 XML语法格式
1.必须有 XML 文档声明
2.必须有且仅有一个根元素
3.严格区分大小写
4.属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次
5.标记成对
6.空标记关闭
7.元素正确嵌套
4.3 XML的生成和解析
4.4 XML的约束
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范(与xml语法无关),这称之为XML约束,可以保证数据的规范性和安全性。
DTD约束:语法自成一派,很早就出现了,可读性比较差
Schema约束:其实就是一个xml , 使用xml的语法规则, xml解析器解析起来比较方便 , 是为了替代DTD 。
但是Schema 约束文本内容比DTD的内容还要多。 所以目前也没有真正意义上的替代DTD