java 常见的注解,什么是注解,自定义注解案例(定义以及使用)模拟Junit

java 自定义注解

1、什么是注解?

注解和接口,类一样,都是属于一种数据类型。
注解可以在变量,方法,类之上加载

注解的作用:
1、编译检查
2、配置(分析代码)
3、生成帮助文档

注解可以有属性也可以没有属性:
(1)@Override 没有属性的注解
(2)@Test(timeout = 1000) 有属性的 注解
注解是有作用范围的:
(1)原码期间有效、String 类之上的@Auther,@see,@since
作用:使用一些命令:javadoc命令将当前的原码生成帮助文件,可以识别String类上的相关的注解 .chm文件

在这里插入图片描述
(2)编译期间有效、@Override @Overload @Deprecated @Suppresswarning

告诉编译器的部分信息

(3)运行期间有效、@Test

作用:在当前代码上以Junit方式运行时,Junit会运行方法上包含@Test注解的方法

//以下注解的含义是:如果当前的方法执行时间超过了1miao,那么会报错
	@Test(timeout = 1000)
	public void test03() {
		try {
			Thread.sleep(2000);//让线程睡2000毫秒
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("test");
	}

JDK当中常见的几种注解:
@Override @Overload @Deprecated @Suppresswaring
以下代码对应相关作用

//以下注解的函含义是:声明当前方法是重写父类的方法
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString();
	}
	public void test01() {
		//以下注解的函含义是:抑制编译器发生警告类的信息
		@SuppressWarnings("unused")
		int i;
		//以下注解的函含义是:抑制编译器发生警告类的信息(如果有变量未使用,未遵循泛型格式,不报警告)
		@SuppressWarnings({ "unused", "rawtypes" })
		List a = new ArrayList();
	}
	//以下注解的函含义是:声明以下的方法是过时的方法,不建议大家使用
	@Deprecated
	public void test02() {		
	}

自定义注解

自定义注解格式:

public @interface 注解名称{	
	public 属性类型  属性名称();//给注解定义一个属性
	//如果需要设置默认值defualt 默认值
	public 属性类型  属性名称() default 默认值;
}
//这种情况报错:原因是因为属性不支持自定义类的类型
	public TestAnnotation aa();

属性类型的范围:only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof--->只允许基元类型、字符串、类、注释、枚举或其一维数组

使用注解
自定义注解属性支持类型:

基本数据类型(4种8种),
String,Class,Annotation(注解类型),枚举类型 以及以上类型的一维类型


//自定义一个注解
public @interface MyAnno01 {
	//在注解当中定义一个属性
	public long timeout() default -1;//给注解定义一个属性	default -1   默认给赋予一个值	
	//这种情况报错:原因是因为属性不支持自定义类的类型
	//public TestAnnotation aa();	
	//注解的属性支持的类型有:基本数据类型(4类8种),比如String Class Annotation(注解类型),枚举类型,以及以上类型的一维数组类型
	public Class c() default java.util.Date.class;
	public String str();
	public MyAnno02 ma();//注解类型的注解属性
	public String[] strs();
}
public @interface MyAnno02 {

}

注解作用: 配置作用

配置:开发的时候部分信息不希望写死在程序中,例如数据库的用户名和密码,可以将用户名和密码存放在.txt , .properties , .xml 文件中,利用程序来读取文件中的内容

框架:一大堆工具类组合,目的:加速项目开发
后期,框架部分hibernate,spring,struts2很多信息需要配置,提供了2种形式配置
(xml,注解)

什么时候用注解来做配置?
1、如果配置信息不会发生的修改,例如servlet路径,建议使用注解的形式

部分代码

/**
 * Servlet implementation class ServletDemo02
 */
//网页访问对应的类,会找下面这条语句对应的类,然后通过反射来调用里面的类
@WebServlet("/ServletDemo02")
@WebInitParam(name="username,value="tom")
public class ServletDemo02 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

在这里插入图片描述
2、如果配置信息需要发生频繁的修改,例如数据库的用户名密码信息,
建议采用传统方法 (.txt , .properties , .xml)
xml配置的信息有广到精确

<students>
  <stu>
   <stuNum>s002</stuNun>
   <stuPhone>
      <stuHomePhone>124324</stuHomePhone>
      <stuCmpPhone>12342143</stuCmpPhone>
   </stuPhone>
  </stu>
</students>

测试使用自定义注解

@MyAnno01(timeout=100,c=java.util.Date.class,strs={"aaa","bbb"})
public void test01(){
}

通过反射读取字节码上的注解信息

  md.isAnnotationPresent(MyTest.class)

* 自定义注解并对其进行使用

1、自定义一个注解


public @interface MyAnno01 {
	// 在注解当中定义一个属性
	public long timeout() default -1;// 给注解定义一个属性 default -1 默认给赋予一个值
	// 这种情况报错:原因是因为属性不支持自定义类的类型
	// public TestAnnotation aa();
	// 注解的属性支持的类型有:基本数据类型(4类8种),比如String Class Annotation(注解类型),枚举类型,以及以上类型的一维数组类型
	public Class c() default java.util.Date.class;
	public String[] strs();
}

2、对注解进行应用(测试使用自定义的注解)

//测试使用自定义注解
public class TestUserAnnotation {
	@MyAnno01(timeout=100,c=java.util.Date.class,strs= {"aaa","bbb"})
	public void test01() { }
}
//测试使用自定义注解
public class TestUserAnnotation {
	@MyAnno01(timeout=100,c=java.util.Date.class,strs= {"aaa","bbb"})
	public void test01() { }
}
案例 自定义注解案例(定义以及使用)模拟Junit

1、自定义注解@MyTest
注意注解的作用域及其目标对象
通过元注解@Rentention @Target 声明当前注解作用域以及目标对象,如果没有声明在运行期间是无法获取到注解的信息的
RetentionPolicy.RUNTIME设置当运行的时候找的是UserDao的字节码文件
2、定义UserDao
创建4个方法addUser delUser upUser getUser,在前三个方法上加注解
3、定义类MyJunit,模拟JUnit
将UserDao.class文件加载到内存当中,获取到字节码文件上所有的方法,遍历方法,判断每一个方法上是否加载了@MyTest注解,如果当前 方法上设置了@MyTest,如果有就执行对应注解的方法

//自定义一个注解,相当于JUnit@Test
//定义注解的时候,需要通过元注解@Retention来说明白当前自定义的注解作用域(Class,Source,Runtime)
//RetentionPolicy.RUNTIME设置这个注解在运行期间有效,如果不设置可能会通过反射无法获取到对应的内容
@Retention(RetentionPolicy.RUNTIME)
//自定义注解的时候,需要通过元注解Target说明当前的自定义注解作用目标对象
@Target(ElementType.METHOD)
public @interface MyTest {
	//在MyTest注解当中定义一个成员属性,默认值为-1
	public long timeout() default  -1;
}

使用注解

public class UserDao {
	static {
		System.out.println("加载静态代码块");
	}
	@MyTest
	public void addUser() {
		System.out.println("增加用户");
	}
	@MyTest
	public void delUser() {
		System.out.println("删除用户");
	}
	@MyTest
	public void uptUser() {
		System.out.println("更新用户");
	}
	public void getUser() {
		System.out.println("获取用户");
	}
}

通过反射获取对应的注解

package com.itzheng.test02;

import java.lang.reflect.Method;

public class MyJunit {

	public static void main(String[] args) throws Exception {
		//加载UserDao.class字节码文件当中的方法,判断哪些方法上有自定义的注解@MyTest,如果当前的方法有@MyTest,就执行,否则就不执行
		
		//1、将UserDao.class字节码文件加载到内存中,clazz对象(代表字节码文件在内存当中的对象)
		Class clazz = Class.forName("com.itzheng.test02.UserDao");//通过反射获取到对应的类
		//2、获取字节码对象上所有的方法,返回Method的数组对象,数组当中的每一个元素都代表Method的对象(相当于字节码上的每一个方法)
		Method[] methods = clazz.getMethods();//获取对应类当中对应的方法
		//3、遍历字节码对象上所有的方法
		for(Method md : methods) {
			//测试方法的名称
			//System.out.println(md.getName());
			//判断当前方法上是否有@MyTest注解信息
			//System.out.println(md.isAnnotationPresent(MyTest.class));
			//isAnnotationPresent判断方法当中有没有这个注解
			if(md.isAnnotationPresent(MyTest.class)) {
				md.invoke(new UserDao());//通过判断是否有对应的注解来获取对应的方法
			}
			
			//如果当前的方法上有@MyTest注解,执行,否则就忽略
		}
	}
}

Java 相关环境设置

环境设置

安装操作系统,安装备份(镜像)
JDK:设置环境变量
Eclipse:解压即可
Ecilpse自身解压目录不包括中文
代码工作空间目录不包括中文
Tomcat:解压不要包含中文目录
MySql:安装:选择编码 utf8

设置Eclipse
1、关联Tomcat
开发过程当中,环境发送变化(重新关联tomcat),
删除servers窗口下的tomcat
Project Explorer 窗口下的server
重新关联widows—>preferences----->servers---->runtime----->tomcat

发布了26 篇原创文章 · 获赞 23 · 访问量 1975

猜你喜欢

转载自blog.csdn.net/qq_44757034/article/details/104511833