Java反射API和注解、元注解

Java反射API和注解、元注解

目录:

反射

1.1 获取Class对象
1.2 类字段相关方法
1.3 构造器相关方法
1.4 方法对象相关方法

注解

2.1 常用注解
2.2 自定义注解
2.3 元注解
2.4 注解实战演示,通过注解来进行方法切入
2.5 注解实现测试框架实例


反射



1. 获取Class对象


1.Class.forName("全类名(包路径+类名)")
2.类名.class
3.对象.getClass()

2. 类字段相关方法


1. 设置值
* void set(Object obj(这里是指创建字节码对象的类的实例化对象), Object value)
2. 获取值
* get(Object obj)  //参数是指类的实例化对象
3. 忽略访问权限修饰符的安全检查
* setAccessible(true):暴力反射
* Field[] getFields() :获取所有public修饰的成员变量
* Field getField(String name)   获取指定名称的 public修饰的成员变量
* Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)   和上面不同的是可以对任意权限修饰符 

3. 构造器相关方法


* T newInstance(Object... initargs)
* Constructor<?>[] getConstructors()
* Constructor<TgetConstructor(<?>... parameterTypes)  黄体参数其实就是目标方法中参数列表的重写 示例:String.class
* Constructor<TgetDeclaredConstructor(<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()

4. 方法对象相关方法


* 执行方法:
* Object invoke(Object obj, Object... args)
* 获取类名(包路径+类名  而不仅仅是类名)
* String getName()
* Method[] getMethods()  只能获取public方法,但是可以获取继承的父类或者接口的方法
* Method getMethod(String name,<?>... parameterTypes)
* Method[] getDeclaredMethods()  可以获取任何权限修饰符修饰的方法,但是不能获取父类或者父接口中的方法
* Method getDeclaredMethod(String name,<?>... parameterTypes)

注解



1. 常用注解


- a.@Overide          检测该注解标注的方法是否是继承自父接口
- b.@Deprecated       表示方法已经过时
- c.@SuppressWarmings 压制警告(通常写在类上@SuppressWarmings("all"),压制所有的警告)

2. 自定义注解


1.1 定义

注解中的属性:其实就是接口中的抽象方法
要求:
1.属性返回值:基本数据类型|String|枚举|注解|以上类型的数组
2.定义了属性,在使用时需要个属性赋值。

  • a.如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
  • b.如果只有一个属性需要赋值,并且属性名是value,则value可以省略,直接在使用该注解时定义值即可。
  • c.在这里数组赋值时是比较特殊的,需要用大括号进行赋值。如果数组织有一个值,那么大括号可以省略。
  • d.疑惑点:1.这里的枚举类型不太了解 2.这里的注解类型肤质有点蒙
  • e.这里说明一下注解|枚举类型在注解中的定义: 注解示例 MyAnno2 anno2(); 枚举示例 Person per();
public @interface MyAnno{

}

1.2 注解的本质

public interface MyAnno extends java.lang.annotation.Annotation {

}

说明:注解本质上就是一个接口,该接口默认继承java.lang.annotation.Annotation接口


3. 元注解


说明:(与注解略有不同,本质相同|也是注解),用来描述注解的注解

  • @Target:描述注解能够作用的位置
    使用(只写了该如何赋值):枚举类型[]|数组 ElementType.TYPE|表示注解只能作用再类上、
    ElementType.METHOD|表示该类只能作用在方法上、
    ElementType|FIEID可以作用于成员变量上
  • @Retention:描述注解被保留的阶段(3个阶段 source|classs|runtime)
    使用 RetentionPolicy.RUNTIME 表示注解会一直保留到3个阶段都结束
  • @Documented:描述注解是否被抽取到API文档中
  • @Inherited:描述注解是否被子类继承(被该元注解描述的注解所修饰的类,任何继承该类的子类都将会继承这个被元注解修饰的注解)

4. 注解实战演示,通过注解来进行方法切入


//步骤一:获取包含指定注解(用于获取配置文件类似信息的注解)的类
Class<ReflectTestaClass = ReflectTest.class;
//步骤二:获取这个注解的对象,通过含有注解的类来获取,注意使用的方法
Myano annotation = aClass.getAnnotation(Myano.class);
//实质上的过程,内存中内部通过这个方法创建了一个实现这个注解接口的类,并且返回了实例化对象
/*
public class 实现类 implements Myano{
public String className(){
return "注解初始化时赋予的值";
}
- ...
}
*/
//步骤三:通过注解对象调用方法即可
String className = annotation.className();
String methodName = annotation.methodName();
System.out.println(className + methodName);

5. 注解实现测试框架实例


1.1 用到的方法

1.public boolean isAnnotationPresent(Class<? extends AnnotationannotationClass) 判断是否包含这个注解(这个方法)Method类是java.lang.reflect.AccessibleObject的子类
2.public synchronized Throwable getCause() 返回...
3.public String getSimpleName()  Class类中的方法,返回异常名称

1.2 主体代码

//综合实践:通过注解测试方法
int number = 0;
//步骤一:获取方法对象
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("D:\\JavaSource\\AllProjects\\LearningJava\\javaWeb\\src\\day1\\Annovacation\\Annocation\\Caculator\\rizzhi.txt"));
caculator caculator = new caculator();
Class<? extends day1.Annovacation.Annocation.Caculator.caculatoraClass = caculator.getClass();
Method[] methods = aClass.getMethods();//最好用Declare获取方法,再用暴力反射,否则会遗漏一些方法
//步骤二:遍历方法,判断是否包含注释:接着捕获异常;输出到文件中打印;
for (Method method : methods) {
if (method.isAnnotationPresent(Check.class)) {
try {
method.invoke(caculator);
} catch (Exception e) {
number++;
bufferedWriter.write(method.getName() + "方法出现异常!");
bufferedWriter.newLine();
bufferedWriter.write("异常的名称:" + e.getCause().getClass().getSimpleName()/*+e.getMessage()+e.toString()*/);
bufferedWriter.newLine();
bufferedWriter.write("异常的原因:" + e.getCause().getMessage());
bufferedWriter.newLine();
bufferedWriter.write("------------------");
bufferedWriter.newLine();
}
}
}
bufferedWriter.write("异常出现的次数:" + number);
bufferedWriter.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值