皮皮安学Java(反射和注解)

一、简介

1.类加载
将class文件读取到内存的过程,称为类加载。

class文件的加载由ClassLoader完成,称为类加载器。
类加载器的三种类型:
BootStrapClassLoader:启动器加载类,C++编写
由JVM在启动时加载初始的,主要负责加载%JAVA_HOME%/jre/lib路径下的类。
ExtClassLoader:扩展类加载器
由BootStrapClassLoader加载,主要负责加载%JAVA_HOME%/jre/lib/ext路径下的类
AppClassLoader:系统类加载器
由BootStrapClassLoader加载,主要负责加载classpath路径下的类

可使用 类名.class.getclassLoader()获取当前类的类加载器。
class文件读取到内存中会被封装成java.lang.class类的对象。

2.反射
在程序运行状态中:
对于任意一个类,都能获取这个类的所有属性和方法。
对于任意一个对象,都能够调用这个对象的任意一个属性和方法。

这种在运行时动态的获取以及动态调用对象方法的功能称为反射reflection.

3.相关API
反射相关的API都在java.lang包中

类/接口名 作用
Class 表示运行的类和接口
Field 表示类中的属性
Method 表示类中的方法
Constructor 表示类中的构造方法
Package 表示类所属的包
Modifier 表示修饰符
Annotation 表示注解
Parameter 表示方法的参数

二、Class对象

1.简介
运行中的class文件通过Class对象表示的
Class对象是类加载时由JVM自动创建的,一个类在JVM中只会有一个Class对象。
Class类没有公共的构造方法,不能自己创建Class对象,但可以获取其实例并进行操作。

Class类是反射的核心类,要想操作类中的属性和方法,都必须获取Class对象开始。

2.获取Class对象
三种方式:
1.调用对象的getClass()方法。
2.调用类的class方法。
3.调用class类的forName()静态方法。

3.常用方法
获取类中的信息
getName() 包名.类名
getSimpleName 类名
isInterface() 是否为接口

扫描二维码关注公众号,回复: 12423370 查看本文章

获取父类:getSuperclass()
获取实现的接口:getInterface()
获取修饰符:getModifiers() [int]返回值
Modifier.toString(…)
获取包:getPackage()
调用元素构造方法创建对象:newInstance();

三、反射操作

1.操作Field
1.获取当前类及父类中所有public修饰的方法:getFields()
2.获取当前类中所有的属性,包含private修饰的方法:getDeclareFields()
3.获取当前类及父类中指定的public修饰的属性:getField("…")
4.获取当前类中指定的属性:getDeclareField("…")

通过反射为属性肤质
set(对象,属性值) 为对象指定的field属性赋值。
setAccessible(true) 取消权限控制检查,访问属性时忽略访问控制符。

通过反射获取属性的值
get(…)获取的对象指定field的属性。

2.操作Method
1.获取当前类即父类中所有的public修饰的方法:getMethods()
2.获取当前类中所有的方法,包含privater修饰的:getDeclareMethods()
3.获取当前类即父类中指定的public修饰的方法:getMethod(“方法名”,参数)
4.获取当前类中指定的方法:getDeclareMethod(“方法”,参数)

通过反射调用方法:
对象.invoke(方法,参数)

3.Constructor
1.获取所有public修饰的构造方法:getConstructors() [ ]返回值
2.获取所有构造方法:getDeclaredConstructors()
3.获取指定的public修饰的构造方法:getConstructor(参数)
4.获取指定的构造方法gettDeclaredConstructor(参数)

通过反射调用构造方法,创建对象
newInstance( )

四、注解

1.简介
Annotation注解是一种新的类型,与接口很相似,它与类,接口,枚举是同一个层次。
注解相当于是一种标况,以@开头,一般写@xxxxx,可以声明在类,属性,方法等前面。
用来对这些元素进行说明,标明或实现特定功能。

2.JDK自带注解
在java.lang包中
注解 作用
@Override 标记在方法前面,表示方法是重写父类的方法
@Deprecated 标记在类,属性,方法等前面,用来该内容已过时,不建议使用
@SuppressWarning 标记类,属性,方法等前面,用来关闭某些警告信息。

3.自定义注解
3.1定义注解
使用@interface关键字+元注解
语法:

						//元注解
						public		@interface		注解名{
									抽象方法
									}
									标准在注解上的注解,称为元注解

元注解 作用
@Target 定义注解的作用域,即可以被标记的哪些元素上,通过枚举类型E来ElementType来取值。
@Retention 定义注解的生命周期通过枚举RetentionPolicy取值
@Documented 指定当使用javadoc生成API文档时包含该注解信息。
@Inherited 指定允许子类继承父类的注解

3.2使用注解
语法:@注解名(属性名=属性值)
在使用注解时需要为注解中的抽象方法,指定返回值,也称为注解指定属性值。

作用域:

	TYOE			类,接口
	FIELD			属性
	METHOD	方法
	PARAMETER	方法参数
	CONSTRUCTOR	构造参数

注:可以同时指定多个值,需要将多个值方到大括号中{ },以逗号隔开。

生命周期取值
SOURCE 注解保留在源文件中,吧参与编译,即class文件没用
CLASS 注解参与编译,保留在class文件中,但在类加载时不加载,即程序运行时没有。
RUNTIME 注解可以保存在程序运行期间,可以通过反射获取该注解。

猜你喜欢

转载自blog.csdn.net/qq_46178251/article/details/107750835