Java 使用类级注释(aspectj)审核类的字段

Java 使用类级注释(aspectj)审核类的字段,java,aspectj,Java,Aspectj,我正在用aspectj编写一个简单的审计框架,它允许我审计用@audit注释的类的字段。 作为值,@Audit注释期望监视一个字段名数组 用法示例: @Audit({“name”,“phoneNumber”}) 类用户{ 私有字符串名称; 私有字符串电话号码; 公共getName(){ 返回名称; }; 公共集合名(字符串名){ this.name=name; } } 观察上面示例中注释的字段分配的方面看起来如何 这里是我第一次尝试的存根: @Retention(RetentionPolicy

我正在用aspectj编写一个简单的审计框架,它允许我审计用@audit注释的类的字段。 作为值,@Audit注释期望监视一个字段名数组

用法示例:

@Audit({“name”,“phoneNumber”})
类用户{
私有字符串名称;
私有字符串电话号码;
公共getName(){
返回名称;
};
公共集合名(字符串名){
this.name=name;
}
}
观察上面示例中注释的字段分配的方面看起来如何

这里是我第一次尝试的存根:

@Retention(RetentionPolicy.RUNTIME)
@目标({ElementType.TYPE})
公共@接口审计{
字符串[]值()
}
@面貌
类AuditAspect{
@切入点(“??”)
public void markedFieldWasModified(){}
@返回后(“markedFieldWasModified()”)
公共无效添加字段到修改字段(JoinPoint jp、AuditableO eo){
eo.addModifiedField(jp.getSignature().getName());
}
//类型间声明
公共接口Iauditableo{
公共迭代器modifiedFields();
公共布尔修改();
公共布尔addModifiedField(字符串字段);
};
}
根据

您应该能够执行
set(**.*)和&@target(审计)


然后,如果修改了可审核字段,则必须检查连接点。

不要过度设计整个过程,直接注释字段而不是类,怎么样?你也可以跳过IAuditableEO接口,我不明白为什么它会有用。下面是一个与您类似的简单示例,只是代码样式语法中的方面(为了清晰起见,我更喜欢它而不是注释样式语法,但是您可以自己轻松地转换它):

字段(非类)的审核注释:

package de.scrum\u master.app;
导入java.lang.annotation.*;
@保留(RetentionPolicy.RUNTIME)
@目标({ElementType.FIELD})
public@interface Audit{}
带有示例main方法的用户类:

package de.scrum\u master.app;
公共类用户{
私有int-id;
@审核私有字符串名称;
@审计私有字符串电话号码;
public int getId(){return id;}
public void setId(int id){this.id=id;}
公共字符串getName(){return name;}
public void setName(字符串名){this.name=name;}
公共字符串getPhoneNumber(){return phoneNumber;}
public void setPhoneNumber(字符串phoneNumber){this.phoneNumber=phoneNumber;}
公共静态void main(字符串[]args){
用户=新用户();
setId(11);
user.setName(“John Doe”);
用户设置电话号码(“+49-1111-23456789”);
System.out.println(“用户(“+User.getId()+”、“+User.getName()+”、“+User.getPhoneNumber()+”));
}
}
审计方面:

package de.scrum\u master.aspect;
导入de.scrum_master.app.Audit;
公共方面{
切入点字段修改():设置(@Audit**);
after():fieldModification(){
System.out.println(此连接点静态部分);
}
}
样本输出:

set(String de.scrum\u master.app.User.name)
设置(字符串de.scrum\u master.app.User.phoneNumber)
用户(11,John Doe,+49-1111-23456789)

如您所见,只捕获带注释的字段,而不捕获ID字段。这允许在每个字段的基础上进行细粒度审计。此外,在advide中,如果您想在和审核数据库中记录任何内容,您可以获得所需的一切:字段类型和名称、类名等等。

如果我正确理解您的问题,则必须在用
@audit
注释的类的setter(所有“set*”方法)上定义切入点。然后,您需要检查方法名称是否与
@Audit
params中的字段匹配,然后处理新值。也许有一种方法可以在我不知道的字段上添加一个观察者。