博客
关于我
Java基础--Annotation
阅读量:505 次
发布时间:2019-03-07

本文共 4779 字,大约阅读时间需要 15 分钟。

其他网址

注解设值/取值

简介

属性可以是单个对象,也可以是数组

可以设值属性为枚举类型;

实例 

package org.example.a;import java.lang.annotation.*;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})@Documented@interface Parent {    Color[] value() default {};}@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})@Documented@interface Bottom {    String name() default "";}enum Color {    RED,    @Bottom(name = "浅红色")    @Parent({RED})    LIGHT_RED,    @Bottom(name = "深红色")    @Parent({RED, LIGHT_RED})    DARK_RED;    List
childrens = new ArrayList<>(); static List
bottoms = new ArrayList<>(); static { for (Color value : Color.values()) { try { Field field = Color.class.getField(value.name()); if (field.isAnnotationPresent(Bottom.class)) { bottoms.add(value); } Parent parent = field.getAnnotation(Parent.class); if (parent != null) { for (Color color : parent.value()) { color.childrens.add(value); } } } catch (NoSuchFieldException e) { e.printStackTrace(); } } }}public class Demo { public static void main(String[] args) { System.out.println("Color.RED.childrens: " + Color.RED.childrens); System.out.println("Color.LIGHT_RED.childrens: " + Color.LIGHT_RED.childrens); System.out.println("Color.bottoms: " + Color.bottoms); try { Field field = Color.class.getField(Color.LIGHT_RED.name()); if (field.isAnnotationPresent(Bottom.class)) { System.out.println("Color.LIGHT_RED的注解属性名: " + field.getAnnotation(Bottom.class).name()); } } catch (NoSuchFieldException e) { e.printStackTrace(); } }}

执行结果

Color.RED.childrens:         [LIGHT_RED, DARK_RED]Color.LIGHT_RED.childrens:   [DARK_RED]Color.bottoms:               [LIGHT_RED, DARK_RED]Color.LIGHT_RED的注解属性名: 浅红色

Annotation+反射 实现工厂模式

其他网址

简介

需求:

代码 

package org.example.a;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//业务接口interface IMessage{    public void send(String msg);}//业务接口实现子类class IMessageImpl1 implements IMessage{    @Override    public void send(String msg) {        System.out.println("send(IMessageImpl1): " + msg);    }}//业务接口实现子类class IMessageImpl2 implements IMessage{    @Override    public void send(String msg) {        System.out.println("send(IMessageImpl2): " + msg);    }}class Factory{    private Factory() {}    public static 
T getInstance(Class
clazz) { try { //利用反射获取实例化对象 return (T) new MessageProxy().bind(clazz.getDeclaredConstructor().newInstance()); } catch (Exception e) { return null; } }}class MessageProxy implements InvocationHandler { private Object target; public Object bind(Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public boolean connect() { System.out.println("connect(proxy)"); return true; } public void close() { System.out.println("close(proxy)"); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if(this.connect()) { return method.invoke(this.target, args);//代理调用 }else { throw new Exception("cannont send"); } } finally { this.close(); } }}@Target({ElementType.TYPE, ElementType.METHOD}) //只能用在类和方法上@Retention(RetentionPolicy.RUNTIME)@interface UseMessage{ //定义要使用的类型 public Class
clazz();}//Annotation定义使用类。红色部分可以修改为其他实现类,实现调用不同类输出。@UseMessage(clazz = IMessageImpl1.class)class MessageService{ private IMessage message; //定义业务处理 public MessageService() { UseMessage use = MessageService.class.getAnnotation(UseMessage.class); this.message = (IMessage) Factory.getInstance(use.clazz()); //通过Annotation获取 } public void send(String msg) { this.message.send(msg); }}public class Demo { public static void main(String[] args) { MessageService messageService = new MessageService(); messageService.send("www.sina.com.cn"); }}

输出结果

connect(proxy)

send(IMessageImpl1): www.sina.com.cn
close(proxy)

转载地址:http://zytjz.baihongyu.com/

你可能感兴趣的文章
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
查看>>
MySQL 命令和内置函数
查看>>
mysql 四种存储引擎
查看>>
MySQL 在并发场景下的问题及解决思路
查看>>
MySQL 基础架构
查看>>
MySQL 基础模块的面试题总结
查看>>
MySQL 备份 Xtrabackup
查看>>
mYSQL 外键约束
查看>>
mysql 多个表关联查询查询时间长的问题
查看>>
mySQL 多个表求多个count
查看>>
mysql 多字段删除重复数据,保留最小id数据
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>