使用java的注解(用在java类的方法上的注解)

场景:根据方法上的注解,通过java反射方式找到需要执行的的方法。
1.注解类

/**注解作用在方法上*/
@Target({ElementType.METHOD}) 
/**注解的生命周期一直程序运行时都存在VM运行期间保留注解,可以通过反射机制读取注解信息*/
@Retention(RetentionPolicy.RUNTIME)
/**注解包含在Javadoc中*/
@Documented  
public @interface Item {
	String value();
}

2.在类的方法上使用注解

public class WorkService {

	private static Logger logger = LoggerFactory.getLogger(WorkService.class);

	@Item("1001")
	public int getItem1001Info(GirlVo girl) {

		logger.info("getItem1001Info输出:");
		logger.info(girl.toString());
		return 1;
	}
	@Item("1002")
	public int getItem1002Info(GirlVo girl) {

		logger.info("getItem1002Info输出:");
		logger.info(girl.toString());
		return 1;
	}
	@Item("1003")
	public int getItem1003Info(GirlVo girl) {
		logger.info("getItem1003Info输出:");
		logger.info(girl.toString());
		return 1;
	}
	@Item("1004")
	public int getItem1004Info(GirlVo girl) {
		logger.info("getItem1004Info输出:");
		logger.info(girl.toString());
		return 1;
	}
	@Item("1005")
	public int getItem1005Info(GirlVo girl) {
		logger.info("getItem1005Info输出:");
		logger.info(girl.toString());
		return 1;
	}
	@Item("1006")
	public int getItem1006Info(GirlVo girl) {
		logger.info("getItem1006Info输出:");
		logger.info(girl.toString());
		return 1;
	}
}

3.实体类,作为参数传递

public class GirlVo implements Serializable  {

	private static final long serialVersionUID = -8545755852948661858L;
	/**ID号*/
	private String girlId;
	/**姓名*/
	private String girlName;
	/**年龄*/
	private Long age;
	/**身高*/
	private Double height;
	/**罩杯*/
	private String cupSize;
	public String getGirlId() {
		return girlId;
	}
	public void setGirlId(String girlId) {
		this.girlId = girlId;
	}
	public String getGirlName() {
		return girlName;
	}
	public void setGirlName(String girlName) {
		this.girlName = girlName;
	}
	public long getAge() {
		return age;
	}
	public void setAge(long age) {
		this.age = age;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public String getCupSize() {
		return cupSize;
	}
	public void setCupSize(String cupSize) {
		this.cupSize = cupSize;
	}

	@Override
	public String toString() {
		
		return "GirlVo [girlId=" + girlId
				+",girlName=" + girlName
				+",age=" + age
				+",height=" + height
				+",cupSize=" + cupSize
				+"]";
	}
}

4.反射调用方法注解的类

public class ReflectCallMethodAnnotation {
	
	private static Logger logger = LoggerFactory.getLogger(ReflectCallMethodAnnotation.class);
	public static void annotationMethod(String item,GirlVo girlVo){
		
		 Class clazz = WorkService.class;
//		 Class clazz = Class.forName("com.zbz.annotation.pattern1.WorkService");
		 List<Method> methods = MethodUtils.getMethodsListWithAnnotation(clazz,Item.class);
		 for (Method method : methods) {
			  for (Annotation annotation : method.getDeclaredAnnotations()) {
				  if (annotation instanceof Item){
					  String code = ((Item) annotation).value();
					  if (Objects.equals(item, code)){
						  try {	
							logger.info("注解号:" + code +" 执行开始...");
							method.invoke(clazz.newInstance(), girlVo);
							logger.info("注解号:" + code +" 执行结束...");
						} catch (Exception e) {
							e.printStackTrace();
							logger.info("抛异常...");
						}
					  }
				  }
			  }
		 }

	}

}

5.main方法测试类

public class TestAnnotation {
	
	private static Logger logger = LoggerFactory.getLogger(TestAnnotation.class);
	 
	public static void main(String []args) throws ClassNotFoundException{
		logger.info("测试开始......");
		HashMap<String,Object> map = (HashMap<String,Object>) getData();
		/**遍历hashMap*/
		for(Entry<String,Object> entry : map.entrySet()){
			String item = entry.getKey();
			GirlVo girlVo = (GirlVo) entry.getValue();
			ReflectCallMethodAnnotation.annotationMethod(item,girlVo);
		}
		
		logger.info("测试结束......");
	}


	public static Map getData() {

		HashMap<String ,Object> data = new HashMap();
		 
		GirlVo girlVo1 = new GirlVo();
		girlVo1.setGirlId("1001");
		girlVo1.setGirlName("张一");
		girlVo1.setAge(27);
		girlVo1.setHeight(169);
		girlVo1.setCupSize("F");
		
		GirlVo girlVo2 = new GirlVo();
		girlVo2.setGirlId("1002");
		girlVo2.setGirlName("王二");
		girlVo2.setAge(29);
		girlVo2.setHeight(175);
		girlVo2.setCupSize("B");
		
		GirlVo girlVo3 = new GirlVo();
		girlVo3.setGirlId("1003");
		girlVo3.setGirlName("刘五");
		girlVo3.setAge(24);
		girlVo3.setHeight(160);
		girlVo3.setCupSize("B");
		
		GirlVo girlVo4 = new GirlVo();
		girlVo4.setGirlId("1004");
		girlVo4.setGirlName("陈六");
		girlVo4.setAge(21);
		girlVo4.setHeight(168);
		girlVo4.setCupSize("C");
		
		GirlVo girlVo5 = new GirlVo();
		girlVo5.setGirlId("1005");
		girlVo5.setGirlName("赵七");
		girlVo5.setAge(25);
		girlVo5.setHeight(169);
		girlVo5.setCupSize("C");
		
		GirlVo girlVo6 = new GirlVo();
		girlVo6.setGirlId("1006");
		girlVo6.setGirlName("张八");
		girlVo6.setAge(26);
		girlVo6.setHeight(165);
		girlVo6.setCupSize("A");
		
		data.put("1001", girlVo1);
		data.put("1002", girlVo2);
		data.put("1003", girlVo3);
		data.put("1004", girlVo4);
		data.put("1005", girlVo5);
		data.put("1006", girlVo6);
		
		return data;
	}

}

以上,TKS.

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以使用 Java 的反射机制来获取方法上的注解,并通过代理来修改注解的值。具体实现可以参考以下代码: ```java import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class AnnotationProxy { public static void main(String[] args) throws Exception { // 获取需要修改注解方法 Method method = MyClass.class.getMethod("myMethod"); // 获取方法上的注解 MyAnnotation annotation = method.getAnnotation(MyAnnotation.class); // 创建代理对象 MyAnnotation proxyAnnotation = (MyAnnotation) Proxy.newProxyInstance( MyAnnotation.class.getClassLoader(), new Class[]{MyAnnotation.class}, (proxy, method1, args1) -> { // 修改注解的值 if (method1.getName().equals("value")) { return "new value"; } else { return method1.invoke(annotation, args1); } }); // 修改方法上的注解 Annotation[] annotations = method.getDeclaredAnnotations(); for (int i = 0; i < annotations.length; i++) { if (annotations[i].annotationType() == MyAnnotation.class) { annotations[i] = proxyAnnotation; } } // 调用方法 MyClass myClass = new MyClass(); myClass.myMethod(); } @MyAnnotation("old value") static class MyClass { public void myMethod() { System.out.println("Hello, world!"); } } @interface MyAnnotation { String value(); } } ``` 在上面的代码中,我们使用Java 的反射机制来获取方法上的注解,并通过代理来修改注解的值。具体来说,我们创建了一个代理对象,然后在代理对象的方法中判断是否需要修改注解的值,如果需要就返回新的值,否则就调用原来的方法。最后,我们将修改后的注解赋值给方法上的注解数组,然后调用方法即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值