注解、反射是所有框架的底层。
框架:mybatis、spring、spring boot…
annotation
注解入门
jdk5.0引入,目前已经jdk12
可以被其它程序(比如编译器)读取——可以实现动态性
通过反射机制读取注解
内置注解
@Override
@Deprecated
@SuppressWarning
suppress 镇压
@SuppressWarnings(“serial”)
@SuppressWarnings(“serial”)的作用
自定义注解,元注解
元注解:给注解注解
meta-annnotation
有4个
@Target
用于描述注解可用在什么地方,类、方法、构造器…
@Retention
retention 保持,维持
用于描述注解在什么时候还有效,一般就是Runtime
Source<Class<Runtime
@Document
说明注解能否生成在javadoc中
@Inherited
inherited 继承
说明子类可以继承父类中的该注解
自定义注解:
@interface
注解的参数:参数类型 + 参数名();
//测试元注解
public class Test {
@MyAnnotation(name = "duan", school = {
"aa","bb"})
//定义了参数必须写参数,此处显示赋值,但默认值已写,就可不写
public void test() {
}
@MyAnnotation("cc")
//若注解只有一个参数,可定义为value,然后此处的value可省略(必须为value才可省略啊)
public void test() {
}
}
//定义一个注解
@Target({
ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
//注解的参数,不是方法
String name() default "";//默认为空
int age() default "";
int id() default -1;//默认值是-1,代表不存在
String[] schools();
}
@Target({
ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2 {
String value();
}
反射
使java语言具有动态性
概述
静态语言:运行时结构不可变。有Java、C、C++
动态语言:运行时,代码可以自身改变。有:Object-C、C##、JavaScript、PHP、Python
java可以称为“准动态语言”,即有一定的动态性。
反射:
反射机制允许程序在执行期借助Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。(包括private)
在加载完类之后,在堆内存的方法区就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构。即,反射。
//
public class Test {
//获取Class对象
Class c1 = Class.forName("com.kuang.reflection.User");//包名+类名,会抛异常
}
//实体类:POJO、entity
class User {
private String name;
private int id;
private int age;
public User() {
}
public User(String name, int id, int age){
...}
...//get、set
@Override
public String toString(){
...}
}
一个类被加载后,类的整个结构都会被封装在Class对象中
理解Class类,获取Class实例(重点)
Class类的常用方法:
获取Class类的实例:
1.
Class clazz = Person.class;
Class clazz = person.getClass();
3.已知全类名:包+名,可能抛ClassNotFoundException异常
Class clazz = Class.forName("demo01.Student");
4.基本数据类型的包装类的Type属性
Class c4 = Integer.TYPE;
5.ClassLoader
类的加载,ClassLoader
java内存
类的加载过程: