Java注解的学习---深入理解Java注解、自己写一个Java注解

什么是注解?
Java中的注解就是Java源代码的元数据,也就是说注解是用来描述Java源代码的。 基本语法就是:@后面跟注解的名称。
①Override:标识某一个方法是否正确覆盖了它的父类的方法。
②Deprecated:表示已经不建议使用这个类成员了。 它是一个标记注解。
③SuppressWarnings:用来抑制警告信息
等等。

要更好的理解注解,我们可以自己写一个注解
@Target : 用来限制注解可以用到那几个地方。比方可以用到类上,可以用到方法胜都可以用@Target来限制

@Retention:这个是用来控制注解编译在Class中的状态的,默认是编译到Class里去,但是不读出来,还有两种状态是 不编译到Class里面去, 最后一种是编译过于,并且可以通过类反射读出来的

@Documented : 可以利用网络来生成注解的

@Inherited : 子类是否能继承注解

那么下面是我们自己写的注解类

package cn.hncu.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

	@Inherited
	@Documented
	@Retention(RetentionPolicy.RUNTIME)
	@Target({ElementType.TYPE,ElementType.METHOD}) //目标: 限制该注解能够用在哪些地方,如果没定义@Target则不限制即无论哪里都可以用
	public @interface MyAnno {
		public String schoolName() default "hncu"; //注解中的成员变量要这么定义
	}

测试,学习使用

package cn.hncu.annotation;

import java.util.ArrayList;
import java.util.Collection;

@MyAnno
public class AnnotationHello {

	private String name="hncu";
	
	public static void main(String[] args) {
		System.out.println("hello");
	}

	@Override
	public String toString() {
		return super.toString();
	}
	
	@MyAnno(schoolName="大城院")
	@Deprecated
	public void abc(){
		System.out.println("abc...");
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void colDemo(){
		Collection col = new ArrayList();
		col.add("aa");
	}
	
	
	//注解,只是给其它程序或代码读取信息的
	@MyAnno(schoolName="湖南城市学院")
	public void demo(){
		System.out.println("1111111");
	}
	
	@MyAnno //因为该注解中的成员变量schoolName设置了默认值,因此这里可以不赋值。若没设置默认值,则必须要在这里赋值
	public void demo2(){
		System.out.println("1111111");
	}
	
	//@MyAnno("abc") //如果注解中的变量名是value,则这里可以不给出变量名
	public void demo3(){
		System.out.println("33333333333");
	}
	
}

通过类反射读出来

package cn.hncu.annotation;

import java.lang.reflect.Method;

public class UseMyAnno {
	public static void main(String[] args) {
		try {
			Class c = Class.forName("cn.hncu.annotation.AnnotationHello");
			
			//判断类上面是否有该注解(@MyAnno)
			boolean boo = c.isAnnotationPresent(MyAnno.class);
			System.out.println("类上是否有该注解:"+boo);
			
			Method ms[] = c.getDeclaredMethods();
			for(Method m: ms){
				//判断方法上面是否有该注解(@MyAnno)
				if(m.isAnnotationPresent(MyAnno.class)){
					System.out.println("有注解的方法:"+m.getName());
					
					//演示读取注解中成员变量的值----从m对象中获取该注解,进而读取它的成员变量的值
					MyAnno ma = (MyAnno)m.getAnnotation(MyAnno.class);
				    System.out.println("学校名称:=="+ma.schoolName());
				    //获取到了这些数据过后,下面就可以开始你的处理了
				}
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值