反射+注解

IDEA基本设置

设置编码格式

  1. Configure - Settings - Editor - File Encodings
  2. 将三个编码全部设置为UTF-8

启用Ctrl+滑轮缩放代码

  1. Configure - Settings - Editor - General
  2. 将右边第二个勾选中。

启用鼠标悬浮智能提示

  1. Configure - Settings - Editor - General
  2. 勾选Other下面的第三个选项“Show quick documentation on mouse move”

IDEA导包(以junit为例)

  1. 准备junit的jar包:
    • hamcrest-core-1.3.jar
    • junit-4.12.jar
  2. 在项目中新建文件夹:lib
  3. 将jar包复制进去
  4. 打开项目结构设置:File - Project Structure
  5. 依次选择“Modules - 你的项目模块 - Dependencies”,打开项目依赖设置
  6. 点击“+”、“JARs or directories”
  7. 选择当前项目中的lib文件夹,确定,即可完成导入。

Lombok的使用

  1. 将 lombok-1.18.4.jar 包导入项目中
  2. IDEA安装插件:lombok-plugins-{版本}.zip
  3. 启用注解:
    • File - Settings - Build,Execution,Deployment
    • Compiler - Annontation Proccessor
    • 选择Default,勾选“enable annotations proccessor”

反射相关类

  1. Class:类的模板,可以根据Class获取目标类的所有信息。
  2. Field:字段/属性。
  3. Constructor:构造函数。
  4. Method:类中的方法。

获取Class的方式

  1. 动态加载
    Class clz = Class.forName("com.demo.bean.User")
    
  2. 通过对象获取
    User zs = new User();
    Class clz = zs.getClass();
    
  3. 通过类获取
    Class clz = User.class;
    

Class相关方法

方法名 描述 结果示例
getName() 获取类的全名称。 com.demo.bean.User
getSimpleName() 获取类名。 User
getFields() 获取所有public的属性。 public int com.bean.User.id
getDeclaredFields() 获取所有属性/字段。 所有public和private的属性和字段。
getMethods() 获取所有public的方法。 public void com.demo.bean.User.setId(int)
getDeclaredMethods() 获取所有方法。 public void com.demo.bean.User.setId(int)
getDeclaredMethod() 获取指定名称的方法。
getConstructors() 获取public的无参构造函数。 public User()
getDeclaredConstructors() 获取所有无参构造函数。
getDeclaredConstructor() 只获取无参构造,因为没有指定参数类型。
getDeclaredConstructor(int.class) 只获取包含int的构造,因为指定了一个int的参数类型。

Field字段

方法名 描述 结果示例
getName() 获取字段的名称。 name
getType() 获取字段的类型。 int

Method方法

方法名 描述 结果示例
getName() 获取方法名。 getName()
getReturnType() 获取方法的返回值类型。 int
invoke() 执行方法,获取返回结果。 (Object)

设置注解的使用场景

使用@Target注解,如下:

@Target(ElementType.TYPE)
public @interface Table { }

设置注解的生命周期(运行时环境)

  1. SOURCE:源码级
  2. CLASS:字节码级
  3. RUNTIME:运行时级
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table { }

为注解设置参数

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
    String name() default "";
}

获取指定类型的注解

Class clz = User.class;
Table table = (Table)clz.getDeclaredAnnotation(Table.class);
if(table!=null && table.name().length()!=0)){
    String name = table.name()
}

猜你喜欢

转载自blog.csdn.net/weixin_42634971/article/details/89243398