Java 可以使用AOP框架向方法或成员添加注释吗?

Java 可以使用AOP框架向方法或成员添加注释吗?,java,aop,Java,Aop,我可以使用AOP(AspectJ、Guice或其他)向我无法修改的类添加注释吗?我的第一个用例是添加持久性和绑定注释。我知道我可以为JPA和JAXB编写XML配置文件,但我不知道如何为JSON绑定编写XML配置文件 我已经查找了一些示例/教程,但没有找到任何说明这一点的内容。有可能吗?如果有,是否有人能提供一个好的例子或更好的例子,并向我提供一些参考资料?是的,您可以为此使用AspectJ(引用,另请参见): 声明@type:C:@SomeAnnotation 声明类型C上的批注@SomeAn

我可以使用AOP(AspectJ、Guice或其他)向我无法修改的类添加注释吗?我的第一个用例是添加持久性和绑定注释。我知道我可以为JPA和JAXB编写XML配置文件,但我不知道如何为JSON绑定编写XML配置文件


我已经查找了一些示例/教程,但没有找到任何说明这一点的内容。有可能吗?如果有,是否有人能提供一个好的例子或更好的例子,并向我提供一些参考资料?

是的,您可以为此使用AspectJ(引用,另请参见):

  • 声明@type:C:@SomeAnnotation
    声明类型
    C
    上的批注
    @SomeAnnotation
  • declare@method:*C.foo*(..):@SomeAnnotation
    在以
    foo
    开头的
    C
    中声明的所有方法上声明注释
    @SomeAnnotation
  • declare@constructor:C.new(..):@SomeAnnotation
    C
    中声明的所有构造函数上声明注释
    @SomeAnnotation
  • declare@field:*C.*:@SomeAnnotation
    C
    中声明的所有字段上声明批注
    @SomeAnnotation
以防万一您想问:此功能仅在本机AspectJ语法中受支持,而在注释样式@AspectJ语法中不受支持


更新:下面是一些示例代码,显示

  • 如何向类、接口和方法添加注释
  • 即使标记为
    @Inherited
    的注释也只能从类继承到子类,而不能从接口继承到类,也不能从子类继承到方法(这是许多开发人员不知道的典型Java警告,有关解释和可能的解决方法,请参阅)
  • 如何通过AspectJ,您仍然可以通过
    +
    子类说明符,例如在
    MyInterface+
    中,对实现接口的类应用注释
  • 另一个方面如何立即查看和使用通过
    declare@type
    declare@method
    等添加的注释
类层次结构,包括抽象基类和接口:

package de.scrum\u master.app;
公共接口MyInterface{
无效剂量();
int doSomethingElse(int a,int b);
字符串sayHelloTo(字符串名称);
}
package de.scrum\u master.app;
公共抽象类NormalBase实现了MyInterface{
@凌驾
公共抽象无效doSomething();
@凌驾
公共内部文件目录(内部a、内部b){
返回a+b;
}
@凌驾
公共抽象字符串sayHelloTo(字符串名称);
}
package de.scrum\u master.app;
公共类Normal扩展NormalBase{
@凌驾
公共无效剂量测定法(){
//System.out.println(“做一些正常的事情”);
}
@凌驾
公共字符串sayHelloTo(字符串名称){
返回“普通问候”+姓名;
}
公共无效不做任何事(){
//System.out.println(“以正常方式懒惰”);
}
}
package de.scrum\u master.app;
公共抽象类专用数据库{
公共摘要void doFoo();
公共摘要void makeBar();
}
package de.scrum\u master.app;
公共类特殊扩展特殊数据库实现MyInterface{
@凌驾
公共无效剂量测定法(){
//System.out.println(“做一些特别的事情”);
}
@凌驾
公共内部文件目录(内部a、内部b){
返回a*b;
}
@凌驾
公共字符串sayHelloTo(字符串名称){
返回“特别问候”+姓名;
}
@凌驾
公屋{
//System.out.println(“Doing foo”);
}
@凌驾
公共void makeBar(){
//System.out.println(“制作条”);
}
公共int doZot(){
返回11;
}
公共字符串makeBlah(){
返回“废话”;
}
}
package de.scrum\u master.app;
公共类SpecialTo扩展SpecialBase{
@凌驾
公屋{
//System.out.println(“Doing foo”);
}
@凌驾
公共void makeBar(){
//System.out.println(“制作条”);
}
公共字符串doXxx(){
返回“Xxx”;
}
公共int makeBlah(){
返回22;
}
}
驱动程序应用程序创建各种对象,调用各种方法:

package de.scrum\u master.app;
公共类应用程序{
公共静态void main(字符串[]args){
System.out.println(“正常实例”);
法线=新法线();
正常剂量();
正常剂量(3,5);
正常。sayHelloTo(“约翰”);
正常;
System.out.println(“\n作为NormalBase的正常实例”);
NormalBase NormalBase=normal;
normalBase.doSomething();
正常基础.剂量表欣酶(3,5);
normalBase.sayHelloTo(“约翰”);
System.out.println(“\n作为MyInterface的正常实例”);
MyInterface MyInterface=正常;
myInterface.doSomething();
doSomethingElse(3,5);
myInterface.sayHelloTo(“约翰”);
System.out.println(“\n特殊实例”);
特殊=新的特殊();
特殊的。doSomething();
特别是doSomethingElse(7,8);
special.doFoo();
特殊。doZot();
特殊的makeBar();
special.makeBlah();
特别:sayHelloTo(“Jane”);
System.out.println(“\n特殊实例作为特殊数据库”);
SpecialBase SpecialBase=特殊;
specialBase.doFoo();
specialBase.makeBar();
System.out.println(“\n作为MyInterface的特殊实例”);
myInterface=特殊;
myInterface.doSomething();
doSomethingElse(7,8);
myInterface.sayHelloTo(“Jane”);
System.out.println(