目录:
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.定义了属性,在使用时需要个属性赋值。
public @interface MyAnno{
}
1.2 注解的本质
public interface MyAnno extends java.lang.annotation.Annotation {
}
说明:注解本质上就是一个接口,该接口默认继承java.lang.annotation.Annotation接口
3. 元注解
说明:(与注解略有不同,本质相同|也是注解),用来描述注解的注解
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();