Java高级应用之反射实现获取,注解(自定义注解)及模拟实现eclipse中Junit插件

@author:Edison丶梦楠

转载请注明作者! 

 

在声明注解时只需要掌握两个:

1:@Retention设置为 RUNTIME。  --àRetentionPolicy枚举类中

SOURCE和CLASS时期我们不需要掌握,想要了解,可以查看此枚举类的API

 

2:@Target 设置为(ElementType.xxx )  xxx表示设置这个注解标签可以贴在哪个上。例如:ElmentType.METHOD 表示此标签可以贴在方法上。具体参照API

ElementType是一个枚举类,里面有几个固定的枚举对象。

 

 

另外:我们要明白的就是:注解得有三个东西:

1:要贴的标签。

2:被贴的程序(类、方法、字段、构造器….

3:一个约束标签的程序

 

 

Java高级应用之反射实现获取,注解(自定义注解)及模拟实现eclipse中Junit插件_第1张图片

 

Java高级应用之反射实现获取,注解(自定义注解)及模拟实现eclipse中Junit插件_第2张图片

Java高级应用之反射实现获取,注解(自定义注解)及模拟实现eclipse中Junit插件_第3张图片

Java高级应用之反射实现获取,注解(自定义注解)及模拟实现eclipse中Junit插件_第4张图片

 

获取类中的构造器注解(类、字段、方法获取实现代码不一 一给出):

1:先拿到这份要获取注解的类的字节码文件

2:通过字节码文件调用getConstructor()方法得到构造器对象

3:通过构造器对象的getAnnotation(注解的字节码对象) 获取注解对象

4:判断注解对象是否为空,再进一步书写业务逻辑

下面给出实现代码:

Java高级应用之反射实现获取,注解(自定义注解)及模拟实现eclipse中Junit插件_第5张图片

 

 

 

 

 

思路:如果我们想要获取一个类的注解:

1:拿到这个类的字节码对象

 

2:利用字节码对象的getAnnotation (注解的字节码对象) 方法返回这个注解的对象。

 

3:判断。(具体业务逻辑根据实际情况编写)

 

 

 

 

如果我们想要获取一个类中所有方法的注解:

1:首先拿到要获取注解的类的字节码文件对象

2:通过此字节码对象的getMethod(name,param);获取方法对象

ps:name为要获取的方法名

       param为方法内 参数的字节码 例如:方法内如果有String xxx参数,那么parama就等于String.class

3通过方法对象调用getAnnotation(注解文件的字节码); 返回此注解字节码的对象

4:判断

 

 

 

 

 

下面是利用自定义Annotation模拟实现eclipse自带Junit插件,实现单元测试。

package com.hard.junit;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
自定义注解 Junit之MyBefor

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyBefor {
	
}
package com.hard.junit;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//自定义注解  Junit之MyTest
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {

}

 

package com.hard.junit;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//自定义注解 Junit之MyAfter

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAfter {

}

 

package com.hard.junit;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
 * @author Edison丶楠
 *  创建时间:2018年12月6日00:13:07
 *  功能:模拟eclipse自带插件Junit
 */
public class MyJunit {
	public static void main(String[] args) throws Exception {
	Class clz = 	Class.forName("com.hard.junit.Test");
	Method[] ms =  clz.getMethods();	
	List testList = new ArrayList<>();
	List afterList = new ArrayList<>();
	List beforList = new ArrayList<>();
	for (Method method : ms) {
		if(method.isAnnotationPresent(MyTest.class)) {
			testList.add(method);
		}else if(method.isAnnotationPresent(MyAfter.class)) {
			afterList.add(method);
		}else if(method.isAnnotationPresent(MyBefor.class)) {
			beforList.add(method);
		}
	}
	Object instance = clz.newInstance();
	for (Method  blist : testList) {
			for (Method  tlist : beforList) {
					tlist.invoke(instance);
			}
		blist.invoke(instance);
		for (Method alist : afterList) {
			alist.invoke(instance);
		}
	  }
	}
}

 

package com.hard.junit;
/*
 模拟测试代码
*/
public class Test {
	
	@MyTest
	public void save() {
		System.out.println("保存信息");
	}
	@MyBefor
	public void select() {
		System.out.println("查询信息");
	}
	@MyAfter
	public void delete() {
		System.out.println("删除信息");
	}
}

 

你可能感兴趣的:(Java高级应用之反射实现获取,注解(自定义注解)及模拟实现eclipse中Junit插件)