注解和反射 笔记

注解、反射是所有框架的底层。
框架: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内存
在这里插入图片描述
类的加载过程:
在这里插入图片描述
在这里插入图片描述

创建运行时类的对象(重点)

获取运行时类的完整结构

调用运行时类的指定结构(重点)

反射的应用:动态代理

猜你喜欢

转载自blog.csdn.net/weixin_40816843/article/details/113252399