注解和注释区别

* 注释:给程序员看的.
* 注解:给虚拟机看的.(让虚拟机看到程序中的注解,注解代表程序的一些特殊的功能.)

JDK中提供的注解

@Override :描述子类重写父类的方法:
* JDK1.5版本的时候 该注解只能应用在 类的继承上.
* JDK1.6版本的时候 该注解可以应用在 类的实现上.
@SuppressWarnings :压制警告.
@Deprecated :描述方法过时.

自定义注解

* 定义类 :class
* 定义接口 :interface
* 定义枚举 :enum
* 定义注解 :@interface

定义注解的属性:
注解的属性的类型:
* 基本数据类型
* String类型
* Class类型
* 注解类型
* 枚举类型
* 以上类型的一维数组

package com.boomoom.a_annotation.demo2;

/**
* 自定义注解
* @author admin
*
*/
@Anno1
@Anno2(a=1,s="abc",c=AnnotationDemo1.class,anno1=@Anno1,color=Color.RED,arrs={"aa","bb"})
@Anno3("abc")
public class AnnotationDemo1 { }
/**
* 定义一个注解:名称是Anno1
*/
@interface Anno1{ } /**
* 定义一个带有属性的注解:Anno2
*/
@interface Anno2{
int a();
boolean b() default false;
String s();
// Date d();
Class c();
Anno1 anno1();
Color color();
String[] arrs();
} enum Color{
RED,BLUE,BLACK,YELLOW;
} @interface Anno3{
String value();
int a() default 1;
}

代码实现

特殊的属性名称:value

* 如果使用注解的时候,只出现了value属性,value属性可以省略的.

代码实现

1、自定义注解:MyTest
2、定义核心运行类.
3、在核心运行类中.
3.1、获得测试类的Class
3.2、获得Class中的所有方法.
3.3、遍历得到每个方法.
3.4、判断方法上有MyTest注解,就执行该方法.
3.5、自定义注解默认存在于源码阶段,需要让注解存在的时间更长.使用元注解:(只用于修饰其他的注解)

package com.boomoom.a_annotation.demo3;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; /**
* 自定义注解
* @author admin
*
*/
// 自定义注解默认存在于源码阶段,需要让注解存在的时间更长.使用元注解:(只用于修饰其他的注解)
// 自定义注解的存在时间有源码、编译和运行阶段,指定为运行阶段,才能在运行时有自定义注解存在
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyTest { }

MyTest

package com.boomoom.a_annotation.demo3;

public class AnnotationDemo1 {
@MyTest
public void demo1(){
System.out.println("demo1执行了...");
} @MyTest
public void demo2(){
System.out.println("demo2执行了...");
} public void demo3(){
System.out.println("demo3执行了...");
}
}

AnnotationDemo1

package com.boomoom.a_annotation.demo3;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* 核心运行类:
* @author admin
*
*/
public class CoreRunner { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
/**
* 获得测试类的Class.
* 获得Class中的所有的方法.
* 遍历每个方法,查看每个方法上是否有MyTest注解.
* 有MyTest注解,这个方法就执行.
*/ // 1.获得测试类的Class:
Class clazz = AnnotationDemo1.class;
// 2.获得Class中的所有的方法: 规定了测试的方法必须是public.
Method[] methods = clazz.getMethods();
// 3.遍历每个方法:
for(Method method:methods){
boolean flag = method.isAnnotationPresent(MyTest.class);
// System.out.println(method.getName()+ " " + flag);
if(flag){
// 说明方法上有MyTest注解:
method.invoke(clazz.newInstance(), null);
}
}
}
}

CoreRunner

模拟@Test的功能实现的更多相关文章

  1. Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。

    package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...

  2. ListView模拟微信好友功能

    ListView模拟微信好友功能 效果图: 分析: 1.创建listView 2.创建数据 3.创建适配器 将数据放到呈现数据的容器里面. 将这个容器(带数据)连接适配器. 其实是直接在我们自己写的a ...

  3. 编写函数模拟strcpy()函数功能

    strcpy(字符数组1,字符串2) strcpy( )用于将字符串2复制到字符数组1中 /* strcpy(字符数组1,字符串2) strcpy( )用于将字符串2复制到字符数组1中 模拟strcp ...

  4. TCP模拟QQ聊天功能

    需求: 模拟qq聊天功能:实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示,然后服务器端也可以输入信息,同样信息在客户端和服务端显示. 提示: 客户端 1) ...

  5. 标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能

    2015.2.27星期五,小雨 标准IO实现的复制功能: #include <stdio.h>#include <errno.h> #define N 64 int main( ...

  6. js模拟实现继承功能

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. 在VFP6中模拟CursorAdapter的功能

    这个是我在2002年做的一个VFP程序中实现的方法, 现在看来功能和VFP8,9中的CursorAdapter非常相似, 因为属性设置有许多相同的地方,我甚至怀疑CA就是就是在这样的基础上再包装出来的 ...

  8. 模拟storage copy 功能失败的记录

    试验设想: 机器1: alter database begin backup 然后,在oracle仍然活动的状态下,将$ORACLE_BASE目录全部压缩拷贝到机器2 机器2: startup:失败 ...

  9. PyQt4 模拟记事本基本功能(保存,打开文件)

    完成功能: 1. 默认[保存]按钮enable 2. 修改文本的内容后,[enable] 3. 解决字符乱码问题:utf-8 4. 提示:如果修改了文件没有保存的时候,又尝试打开新的文件,给出相关的提 ...

  10. Android+struts2+json方式模拟手机登录功能

    涉及到的知识点: 1.Struts2框架的搭建(包括Struts2的jSON插件) 2.Android前台访问Web采用HttpClient方式. 3.Android采用JSON的解析. 服务端主要包 ...

随机推荐

  1. 理解npm、nvm、nodejs之间的关系

    nvm nvm:nodeJs版本管理工具,管理nodejs版本和npm版本,使用nvm安装nodejs时会将npm一起安装下来 nodejs nodeJs: 一种高效的JavaScript运行环境 n ...

  2. Java 中的String、StringBuilder与StringBuffer的区别联系(转载)

    1 String 基础 想要了解一个类,最好的办法就是看这个类的源代码,String类源代码如下: public final class String implements java.io.Seria ...

  3. [转帖]NUMA架构的CPU -- 你真的用好了么?

    NUMA架构的CPU -- 你真的用好了么? 本文从NUMA的介绍引出常见的NUMA使用中的陷阱,继而讨论对于NUMA系统的优化方法和一些值得关注的方向. 文章欢迎转载,但转载时请保留本段文字,并置于 ...

  4. [转帖]TCP和UDP的135、137、138、139、445端口的作用

    TCP和UDP的135.137.138.139.445端口的作用 https://www.cnblogs.com/IvanChen/p/4500698.html 竟然不知道 端口具体是干什么的.. 如 ...

  5. Windows10 等 administrator 打开IE 或者edge的方法

    gpedit.msc 组策略处理即可

  6. MySQL简介及安装

    一.DBA工作内容及课程体系 二.MySQL课程体系介绍 三.DBA的职业素养 四.MySQL简介及安装 01 什么是数据? 02 什么是数据库管理系统 03 数据库管理系统种类 04 MySQL发展 ...

  7. python爬虫scrapy之downloader_middleware设置proxy代理

    一.背景: 小编在爬虫的时候肯定会遇到被封杀的情况,昨天爬了一个网站,刚开始是可以了,在settings的设置DEFAULT_REQUEST_HEADERS伪装自己是chrome浏览器,刚开始是可以的 ...

  8. 使用getopts处理输入参数

    在编写shell脚本中,需要输入参数,使用过程中,getopts更加方便.可以很好的处理用户输入的参数和参数值. 参加如下一段脚本: #!/bin/bash while getopts ": ...

  9. 离线安装redis-cluster

    #离线安装redis-cluster https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.5.tar.gz #安装ruby .tar.gz cd rub ...

  10. spring 注解 之 AOP基于@Aspect的AOP配置

    Spring AOP面向切面编程,可以用来配置事务.做日志.权限验证.在用户请求时做一些处理等等.用@Aspect做一个切面,就可以直接实现. 1.首先定义一个切面类,加上@Component  @A ...