java进阶篇02、注解、反射与动态代理

一、注解

声明一个注解使用@interface关键字;

public @interface Test{
String value(); //无默认值
int age() default 1; //有默认值
}

1、元注解

对注解类进行注解的注解我们称之为元注解;常用的元注解有四个;

@Target

标记另一个注解类,声明该注解可以作用的范围;
ElementType.ANNOTATION_TYPE 可以应用于注解类型。
ElementType.CONSTRUCTOR 可以应用于构造函数。
ElementType.FIELD 可以应用于字段或属性。
ElementType.LOCAL_VARIABLE 可以应用于局部变量。
ElementType.METHOD 可以应用于方法级注解。
ElementType.PACKAGE 可以应用于包声明。
ElementType.PARAMETER 可以应用于方法的参数。
ElementType.TYPE 可以应用于类的任何元素。

@Retention

标记另一个注解类,声明该注解的保留策略;
RetentionPolicy.SOURCE - 标记的注解仅保留在源级别中,并被编译器忽略。
RetentionPolicy.CLASS - 标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略。
RetentionPolicy.RUNTIME - 标记的注解由 JVM 保留,因此运行时环境可以使用它。

@Documented

标记另一个注解类,声明该注解用于被javadoc工具提取成文档;

@Inherited

标记另一个注解类,表示允许子类继承父类中定义的注解;

2、注解应用场景

RetentionPolicy.SOURCE源码级别的注解:提供给IDE语法检查、APT等场景使用; RetentionPolicy.CLASS class级别的注解:字节码操作,直接修改class字节码文件; RetentionPolicy.RUNTIME 运行级别的注解:结合反射技术获取注解中的所有信息;

二、反射

反射是Java被视为动态语言的关键;

反射是指在运行过程中,对于任何一个类,都能够知道这个类所有属性和方法,都能创建该类的对象;对于任意一个对象,都能够调用它的任意方法,能够设置它的任意属性;

反射始于Class,Class是一个类,封装了当前对象所对应的类的信息;一个类中有方法,属性,构造方法等,现在需要一个类,用来描述类,这就是Class,他应该有类名、属性、方法和构造器等;Class是用来描述类的类;

Class类是一个对象照镜子的结果,对象可以看到自己有哪些属性、方法、构造器,继承了那些类、实现了哪些接口等等;对于每个类,JRE都为其保留一个不变的Class类型的对象,一个Class对象包含了特定某个类的有关信息;一个类在JVM中只会有一个Class实例;

1、获取Class对象的三种方式

  1. 通过类名获取 类名.class
  2. 通过对象获取 对象名.getClass()
  3. 通过全类名获取 Class.forName(全类名)

2、判断对象类型及Class对象类型

我们可以使用instanceof关键字判断一个对象是否是某个类的实例;

在Class类中也有两个方法用于类似的判断; public native boolean isInstance(Object var)方法用于判断一个对象是否属于某个类; public native boolean isAssignableFrom(Class<?> var)方法用于判断两个Class对象是否表示的同一个Class;

3、创建实例

通过反射生成对象主要有两种方式: 方法一:通过Class对象的newInstance方法构造对应类的对象; 方法二:通过Class对象的getConstructor方法获得Constructor对象,再调用Constructor对象的newInstance方法构造对象,这种方法可以用指定的构造器创建对象;

4、获取构造器对象的方法

Constructor getConstructor(Class[] params) 获得使用特殊的参数类型的public构造函数(包括父类)

Constructor[] getConstructors() 获得类的所有公共构造函数 (包括父类)

Constructor getDeclar Java开源项目【ali1024.coding.net/public/P7/Java/git】 edConstructor(Class[] params) 获得使用特定参数类型的构造函数(包括私有)

Constructor[] getDeclaredConstructors() 获得类的所有构造函数(包括私有)

Constructor对象 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 的newInstance方法用于获取类的实例对象;

5、获取类的成员变量(字段)的方法

Field getField(String name) – 获得命名的公共字段(包括父类)
Field[] getFields() – 获得类的所有公共字段(包括父类)
Field getDeclaredField(String name) – 获得类声明的命名的字段(包括私有)
Field[] getDeclaredFields() – 获得类声明的所有字段(包括私有)
Field对象的set和get方法用于获取和设置属性值;

6、获取类的方法

Method getMethod(String name, Class[] params) 使用特定的参数类型,获得命名的公共方法(包括父类)
Method[] getMethods() 获得类的所有公共方法 (包括父类)
Method getDeclaredMethod(String name, Class[] params)使用特写的参数类型,获得类声明的命名的方法(包括私有)

Java高频面试专题合集解析:

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

更多Java架构进阶资料展示

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等
存中…(img-2e6n70DK-1650435924822)]

[外链图片转存中…(img-g5yIuFzc-1650435924823)]

[外链图片转存中…(img-A4JWZ1ZX-1650435924824)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值