目标,创建一个方法注解,我们能够初始化时执行该方法,并可以给该方法传入注解的参数值
假设我们设计一个sayHello(String name) 方法,给该方法做个注解,初始时使用注解传入"小明"
package annotation;
public class HelloWorldStub {
@HelloWorldAnnotation(name = "小明")
public String sayHello(String name) {
if (name == null ) {
name = "";
}
return name + " say hello world!";
}
}
定义注解
package annotation;
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;
@Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取
@Target(ElementType.METHOD)//目标是方法
@Documented//文档生成时,该注解将被包含在javadoc中,可去掉
public @interface HelloWorldAnnotation {
public String name() default "";
}
我们的测试类
package annotation;
import java.lang.reflect.InvocationTargetException;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestHelloWorldAnnotation {
@Test
public void testHello() throws IllegalArgumentException,
IllegalAccessException, InvocationTargetException,
SecurityException, NoSuchMethodException, InstantiationException {
//定义操作类
ParseAnnotationStub parse = new ParseAnnotationStub();
//假设我们知道类HelloWorldStub使用了注解,执行HelloWorldStub中带注解的方法
//判断是否使用了注解的name()方法,设置name = "小明",并返回"小明 say hello world!"
String returnValue = parse.parseMethod(HelloWorldStub.class);
assertEquals("小明 say hello world!", returnValue) ;
}
}
执行的注解方法的操作类
package annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ParseAnnotationStub {
//包装了下Java基本的方法反射(范围是带了我们特定注解的方法)
//传入我们要执行的类型,所以我们时常发现某些框架要我们定义好类查找的范围,或前后缀什么的
//可以设置返回值为空void 或者Object通用,这里我们为了测试采用String返回值
public String parseMethod(Class<?> clazz) throws IllegalArgumentException,
IllegalAccessException, InvocationTargetException,
SecurityException, NoSuchMethodException, InstantiationException {
//获得该对象
Object obj = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{});
//变量该对象的方法
for (Method method : clazz.getDeclaredMethods()) {
//获取方法的注解,这里特定获取方法上@HelloWorld注解
HelloWorldAnnotation say = method.getAnnotation(HelloWorldAnnotation.class);
//如果@HelloWorld注解不空,即方法有@HelloWorld注解
if (say != null) {
//这里我们先前定义了 UseHelloWorld.sayHello(String name)方法
//这里可以从注解中获取值,或者直接运行,或者缓存该对象方法
String name = say.name();
return (String)method.invoke(obj, name);
}
}
return "";
}
}
分享到:
相关推荐
java 自定义注解验证 可自己添加所需要的注解,本案例中只写了三个自定义注解类 本案例只花了半天时间,如有不好之处请多提提意见。谢谢!
包括Java自定义注解以及包括自定义注解的应用实例。以及注解相关知识的注解
Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解 Spring java注解,元注解和自定义注解
通过一个超市的自动售卖机的例子,详细说明了java的自定义注解的使用。
springboot工程通过自定义response注解、java反射机制、自定义java拦截器、自定义功能类实现WebMvcConfigurer接口等功能,实现自定义规范化返回数据结构。
这个一个自定义注解实现给注解传递伪动态参数的小案例,可以在此自定义注解的基础上来记录接口的调用记录。
SpringBoot AOP各种注解、自定义注解、鉴权使用案例SpringBoot AOP各种注解、自定义注解、鉴权使用案例SpringBoot AOP各种注解、自定义注解、鉴权使用案例
使用Java自定义注解来拼接SQL查询语句,方便使用。
Java基础复习笔记12Java自定义注解Annotation的使用
java 元注解+拦截器实现自定义注解 @CmwAutoWired:自定义依赖注入 注意:注入的接口和实现类需要在同一包名下,注解的是类则无限制 @FieldAnnotation:自定义属性注解 @MethodAnnotation:自定义方法注解 @...
简单demo,导入即可运行。
自定义注解实现由类自定生成数据库中的表,适合各种类型的数据库,本案例主要实现的时sql server和oracle
java自定义注解实践,介绍详细!值得参考
利用java注解机制,实现自定义注解实例,例子中实现了简单的注解赋值和获取并打印值。
JPA、EJB、Spring零配置等等怎么使用相信各位读者都能掌握,这里主要是说如何自定义自己的注解,自己使用自定义的注解。
java自定义 注解 annotation、标签库tag、监听listener、junit简单测试代码
自定义注解和通过反射获取注解
自定义注解得使用,模拟spring通过注解方式创建bean实例!
我们在项目开发过程中,可能会对一些公用方法抽成工具类进行使用。如果我们把这些方法再抽成注解的形式,在一些业务情况下是否更灵活一些呢? 示例是纯净的,只引入了需要的架包,启动后直接访问:ip:port/user/test ...
主要介绍了Java使用自定义注解实现函数测试功能,结合实例形式分析了java自定义注解在函数测试过程中相关功能、原理与使用技巧,需要的朋友可以参考下