注解和反射

注解

annotation的作用

1.不是程序的本身,可以对程序做出解释

2.可以被其他的程序读取

annotation的格式

annotation的格式

@注解名,还可以添加一些参数

annotation使用场景

1.package、class、method、field,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些源数据的访问

内置注解

@override定义在lang包下,声明为重写方法

    • 该方法会覆盖或实现在超类型中声明的方法。
    • 该方法的签名覆盖等效于Object中声明的任何公共方法的签名

@Deprecated

定义在lang包下,表示已被淘汰方法,或者过时了

不推荐程序员使用,但是可以正常执行

@SuppressWarning 压制警告的作用(包含一个参数)

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE, ElementType.MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

查看源码可知,SuppressWarning包含了一个参数,类型为string类型

元注解

1.Target:描述注解的使用范围

2.Retention:表示我们的注解在什么地方有效

runtime>class>source

3.Document:表示是否将我们的注解生成在javadoc中

4.inherited子类可以继承父类的注解

备注:注解的格式

@interface 注解名{};

注解的参数:参数类型+参数名();

反射机制

概念

动态语言:在运行时可以改变其结构的语言。

静态语言:在运行时可以不能改变其结构的语言

java称之为:准动态语言

反射

反射机制允许程序在执行期借助ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性的方法

正常方法:引入需要的包类的名称–>new实例化对象——>取得实例化对象

反射方法:实例化对象–>getClass()—>得到完成包类的名称

优点:可以实现动态创建对象和编译,体现出很大的灵活性。

缺点:对性能有影响,通常反射基本上是一种解释操作,我们可以告诉JVM我们希望做什么并且满足我们的要求,这类操作总是鳗鱼直接执行的相同操作

获得class对象的方法

类名.class;

类名.getClass;

getClassForName(“全限定名”);

只要元素类型和维度一样,都是同一个类

类的初始化

主动引用(一定会发生类的初始化)

  • 当java虚拟机启动时,先初始化main方法所在的类

  • 当new一个类的对象

  • 当调用类的静态方法和静态变量(除了final常量)

  • 使用java.lang.reflect包的方法进行反射调用

  • 当初始化一个类 ,如果父类没有被调用,贤惠初始化父类

被动引用(不会发生类的初始化)

1。当访问一个静态域时,只有真正声明这个域的类才会被初始化,。

2.通过 数据定义类引用,不会触发此类的初始化

3.引用常量不会触发此类的初始化

类加载器的作用

作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,他讲维持加载(缓存)一段时间。不过JVM垃圾回收机制可以回收这些Class对象(提高效率)

类加载器分类:
1.引导类加载器:用C++编写的,是JVM自带的类加载器,负责JAVA平台核心库,用来装载核心类库。

2.扩展类加载器:负责jre/lib/ext目录下的jar或者- D java.etx.dirs指定目录下的jar包装入工作库

3.系统加载类:负责java-classpath或者-D java.class.path所指的目录下的类与jar包装入工作,是最常用的加载器

getMethods()获得本类和父类的全部public方法

getDeclaredMethods()获得本类的全部方法

注:不能直接操作私有属性需要关闭程序的安全监测,通过setAccessiable()方法,为true不开启监测

反射操作泛型

java采用泛型擦除的机制来引入泛型,java中的泛型仅仅时给编译器javac使用的,确保数据的安全性和免去强制类型转换问题,但是 一旦编译完成,所有和泛型有关呢的类型全部擦除

PrarmeterizedType:表示一种参数化类型(比如Collection)

GenericArrayType:表示一种元素类型时参数化类型或者类型变量的数组类型

TypeVarible:是各种类型变量的公共父接口

WildcardType:代表一种通配符类型表达式

反射操作注解

ORM:对象关系映射

类和表结构对应

属性和字段对应

对象和记录对应

上一篇:Spring Boot----@Valid


下一篇:Java基础 Java注解详解