參考

概念:java提供了一种原程序中的元素关联不论什么信息和不论什么元数据的途径和方法

JDK内置系统注解

@Override 用于修饰此方法覆盖了父类的方法;

@Deprecated 用于修饰已经过时的方法;

@Suppvisewarnings 用于通知java编译器禁止特定的编译警告。



注解依照执行机制划分

源代码注解:注解仅仅在源代码中存在,编译成.class文件就不存在了;

编译时注解:注解在源代码和.class文件里都存在(例:JDK自带注解);

执行时注解:在执行阶段还起作用,甚至会影响执行逻辑的注解(Autowired);

自己定义注解的元注解

  1. @Target—作用域(constructor(构造方法声明),field(字段声明)。local_variable(局部变量声明),method(方法声明)。package(包声明),parameter(參数声明),type(类,接口声明))
  2. @Retention—生命周期(source:仅仅在源代码显示,编译时会丢弃。

    class:编译时会记录到class中。执行时忽略。runtime:执行时存在。能够通过反射读取)

  3. Inherited—标识注解(同意子类继承)
  4. Documented—生成Javadoc
  5. 若成员仅仅有一个,必须为value,这个參数赋值能够不写value=XXX





成员以无參无异常方式声明。

成员类型是受限的,合法的类型包含原始类型及String,Class,Annotation, Enumeration.

上面用了注解,程序中获得注解信息的方法是反射

Class cls = Class.forName(“”);//使用类载入器载入类

cls.isAnnotationPresent(xx.class);//推断cls这个类上是否有xx的注解,找到类上注解

xx a = (xx)cls.getAnnotation(xx.class);//取得其上的注解

以下附一个实例。是框架怎样使用注解描写叙述參数。

结构图

A.java

package javaBasic;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.PARAMETER ,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface A {
String value();
String name() default "bingone";
int age() default 20;
}

B.java

package javaBasic;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.PARAMETER ,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface B {
String value();
String name() default "bingone"; }

DataClass.java

package javaBasic;

public class DataClass {
public String name;
public int age;
public DataClass(String name, int age) {
super();
this.name = name;
this.age = age;
} }

RunClass.java

package javaBasic;

public class RunClass {
public static void run(@A("str") String str,@B("age")int age){
System.out.println("In run Method str:" + str + "age:" + age);
}
}

TestClass.java

package javaBasic;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
* 通过注解传參数
* @author gg_gogoing
*
*/
public class TestClass {
public static void parseMethod(DataClass data,Object obj,String mthname){
//验证是否有注解
//若有则两种方法:
//1. 在编译时刻已经有了相应的表,查表就可以
//2. 例如以下的遍历方式。 if(obj instanceof RunClass){
String str = null;
int age = 0;
Method [] methods = (Method[])obj.getClass().getMethods();
for(Method method :methods){
if(method.getName().equals(mthname)){
Annotation[][] annotations = method.getParameterAnnotations();
for(Annotation[] tt : annotations){
for(Annotation t:tt){
if(t instanceof A){
str = data.name;
}else if(t instanceof B){
age = data.age;
}
}
}
RunClass.run(str, age);
}
}
}
} public static void main(String[] args) throws Exception, RuntimeException { // 主方法
//不直接传參数,而是将一个类中的数据传入
DataClass dc = new DataClass("gg_gogoing", 20);
parseMethod(dc, new RunClass(), "run"); } }

最新文章

  1. python3  threading初体验
  2. 使用Emit把Datatable转换为对象集合(List<T>)
  3. Linux C 字符串输入函数 gets()、fgets()、scanf() 详解
  4. OpenCV2+入门系列(三):遍历图像的几种方法
  5. hdu1000,hdu1001,hdu1002,hdu1003
  6. AgileEAS.NET SOA 中间件2013第四季度发布&部分功能开源预告
  7. if else 语句练习
  8. IP进制站群原理
  9. UIAlertController 简单修改title以及按钮的字体颜色
  10. poj 3608 Bridge Across Islands
  11. 关于plist文件
  12. (转) eclipse debug (调试) 学习心得
  13. Qt布局管理
  14. table 中的td 字段超长,超过部分用....表示
  15. CSS中padding和margin以及用法
  16. Windows -- 从注册表删除IE浏览器加载项
  17. [winograd]winograd算法在卷积中的应用
  18. yii2 httpClient的用法
  19. 剑指Offer_编程题_24
  20. Unity Awards 2018最佳资源

热门文章

  1. MySQL 四种事务隔离级别详解及对比--转
  2. SQL server存储过程及触发器基础
  3. jQuery学习笔记(5)-事件与事件对象
  4. Pro ASP.NET Core MVC 6th 第三章
  5. apache自带的ab压力测试工具
  6. 通过Maven将指定Jar包下载到指定的本地目录
  7. UI设计四要素
  8. mac系统,鼠标移动太慢
  9. CSS 类名的问题
  10. 网络编程 - socket接收大数据