java注解和反射

junit的单元测试

使用测试在所测试的方法上加上@Test ,在导入junit包进行测试

@Before:在@Test的方法之前运行

@After :在@Test的方法之后运行

tip:Assert.assertEquals(期望的结果,运算的结果);

反射

  • 反射获取对象的三种方式

    1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
    多用于配置文件,将类名定义在配置文件中。读取文件,加载类

    2.类名.class:通过类名的属性class获取
    多用于参数的传递

    3.对象.getClass():getClass()方法在Object类中定义着。
    多用于对象的获取字节码的方式

通过class对象来获取属性,方法,构造器并执行和修改属性

  • 获取成员变量

    • Field[] getFields() :获取所有public修饰的成员变量
    • Field getField(String name) 获取指定名称的 public修饰的成员变量
    • Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
    • Field getDeclaredField(String name)
      • 获取后返回Field变量可以进行下面操作:
      • 设置值
        • void set(Object obj, Object value)
          2. 获取值
          * get(Object obj)

          1. 忽略访问权限修饰符的安全检查
            • setAccessible(true):暴力反射
  • 获取构造器

    • Constructor<?>[] getConstructors()
    • Constructor getConstructor(类<?>... parameterTypes)
    • Constructor getDeclaredConstructor(类<?>... parameterTypes)
    • Constructor<?>[] getDeclaredConstructors()
      • Constructor:构造方法
        • 创建对象:
          • T newInstance(Object... initargs)
  • 获取方法

    • Method[] getMethods()
    • Method getMethod(String name, 类<?>... parameterTypes)
    • Method[] getDeclaredMethods()
    • Method getDeclaredMethod(String name, 类<?>... parameterTypes)
    • 执行方法:
      • Object invoke(Object obj, Object... args)

      • 获取方法名称:

        • String getName:获取方法名

注解

  • 四个元注解

元注解:用于描述注解的注解
* @Target:描述注解能够作用的位置
* ElementType取值:
* TYPE:可以作用于类上
* METHOD:可以作用于方法上
* FIELD:可以作用于成员变量上
* @Retention:描述注解被保留的阶段
* @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
* @Documented:描述注解是否被抽取到api文档中
* @Inherited:描述注解是否被子类继承

自定义注解

@Target({ElementType.TYPE,ElementType.METHOD})
@Tetention(TetentionPolicy.RUNTIME)
public @interface one_anno{
    
}

​ 自定义注解后可以标注在类上,这样我们就可以通过反射获取类中带有注解的方法,和带有注解的类,进行下一步操作;;;

posted @ 2021-09-14 22:41  mankaixin  阅读(23)  评论(0编辑  收藏  举报