注解&反射

注解

注解和注释

注释不影响代码 & 注解有一些特定的功能

预定义注解

@Override @Deprated SuppressWarnings

元注解

用于定义注解的注解

@Target 注解位置

@RetentionPolicy 保留周期

自定义注解

  • 用元注解创建自定义注解
  • 作用:存储一个值 XXX.class.getAnnotation().xx();拿到抽象方法返回值,就是这里存储的值。
    • @XXX(a=””,b=””)
    • 如果恰好有一个抽象方法名字是value,注解调用的时候就不用写名字

自定义注解和预定义注解的区别

自定义注解不像预定义注解有一些默认的功能,自定义注解要配合反射使用,往往是在代码中直接定义一些值,这些值将在实际程序运行的时候加载和使用。

反射

什么是反射

反射是用代码操作代码、用面向对象诠释面向对象的一种机制/技术。

面向对象中,所有的对象都有对应的类(除了int、char、byte…)。现在把所有的类都看作对象,那么就有描述类的类,这个类就是java.lang.Class

如何获取Class的对象

  • 类.class
  • 对象(指通俗的对象).getClass()
  • Class.$forName$(“全限定类名”)

为什么synchronized锁旗标用当前类.class?

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ClassDemo2{
/**
* ClassDemo2.class
*/
public static synchronized void a(){

}
public static void b(){
synchronized(ClassDemo2.class){

}
}
}
image-20230826091251008

把ClassDemo2看作对象,描述它的类是Class,Class的一个对象引用的地址就是这个“对象”的地址,这个“对象”只存在一个,地址只存在一个,所以不管什么时候在哪里以哪种方式获取到的都是同一个字节码对象。

反射

  • 获取内容
    • 构造方法
    • 方法
    • 字段
  • 创建对象
  • 执行方法

暴力反射

getDeclaredXXX()获取到访问不到的内容(比如private修饰的构造方法、字段、方法)

但现在拿到了却没有权限使用,设置一下权限 setAccessable(true)

然后newInstance()、set()、invoke()等

执行字节码文件里面的方法

如果只拿到字节码文件,往往没有办法直接运行,用反射可以

Class.$classforName$(“字节码文件对应的全限定类名”).getXXX().invoke()等


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!