java - 将 TYPE 注释传递给方法而不是标记接口
问题描述
[回答编辑]:简短的回答是我想做的事情是不可能的。我的问题有点误导。我了解到标记接口模式实际上就是我在问题中所说的标记注释(因为您创建的注释实际上是一个接口)。并且只能在运行时进行检查。因此,如果您希望很好地使用注释进行编译时检查,那是不可能的。空接口是唯一的选择。检查答案以查看如何在运行时执行此操作。
我试图避免使用标记接口来支持标记注释。基本上我想用这个注释标记一堆类,并将这些类的实例传递给接受该类型的方法。这是我的代码:
标记注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Message {
}
班级:
@Message
public class MessageTypeA {
}
方法:
public class DatabaseWriter {
public void save(Message msg) {
//some code
}
}
调用代码:
MessageTypeA msgA = new MessageTypeA();
DatabaseWriter writer = new DatabaseWriter();
writer.save(msgA);
但是我得到Error:(78, 23) java: incompatible types: MessageTypeA cannot be converted to Message
我不确定我正在做的事情是否可行,但我读到可以用标记注释替换标记接口。在这种情况下不可能吗?
谢谢
解决方案
标记接口模式是一种将元数据添加到运行时可读的程序类型或对象的方法。
例如,请参阅此模式的休眠实现。他们的insert
方法接受一个 plain java.lang.Object
,并且在该方法中使用来自各种注释的元数据。
所以,按照你的示例实现,我会用这样的东西
public class DatabaseWriter {
public void save(Object msg) {
if (msg.getClass().isAnnotationPresent(Message.class)) {
//some code
}
}
}
推荐阅读
- javascript - MongoDB不更新数据
- flutter - Flutter 将 SingleChildScrollView 或 ListView 添加到屏幕中的部分小部件
- android-sqlite - 我想在不根据行数据的情况下在完整列中输入数据
- swift - 根据标签文本动态改变单元格高度
- java - 我们如何使用公钥从托管在服务器中的应用程序使用 JSch 连接到 SFTP 服务器
- python - 使用 kubernetes cronjobs 调度 django 命令
- java - 如何生成没有重复号码的 4 位密码
- powershell - 如何刷新 PowerBI 报表?
- excel - Excel:连接具有公共字段值的所有行的单元格
- java - 如何用某个变量结束while循环