Java 如何制作getter';s在同一类中调用强制

Java 如何制作getter';s在同一类中调用强制,java,jakarta-ee,design-patterns,annotations,java-7,Java,Jakarta Ee,Design Patterns,Annotations,Java 7,我有以下代码: 我如何在getAll方法中强制使用getService()方法,这意味着如果我直接调用service.findAll()编译失败 是否可以创建注释以禁止直接使用该字段 @Named @Profile("default") public class AlfrescoVersionServiceImpl { @Inject //Request Scope service private AlfrescoService service; @Resource

我有以下代码: 我如何在getAll方法中强制使用getService()方法,这意味着如果我直接调用
service.findAll()
编译失败

是否可以创建注释以禁止直接使用该字段

@Named
@Profile("default")
public class AlfrescoVersionServiceImpl  {

   @Inject
   //Request Scope service
   private AlfrescoService service;

   @Resource
   private WebServiceContext webServiceContext;


   public List<Fichier> getAll(){
       return getService().findAll();
   }


   public AlfrescoService getService(){
       service.setEnPointAdress("--");
       if(webServiceContext.isUserInRole(role)){
           service.setRole("--");
       }
   }


}
@Named
@配置文件(“默认”)
公共类户外服务MPL{
@注入
//请求范围服务
私人户外服务;
@资源
私有WebServiceContext WebServiceContext;
公共列表getAll(){
返回getService().findAll();
}
公共户外服务{
service.setenpointaddress(“--”);
if(webServiceContext.isUserInRole(角色)){
service.setRole(“--”);
}
}
}
提前感谢您的回复

findAll()
中,您可以使用
Thread.getStackTrace()
检查当前堆栈跟踪,并确保前面的
StackTraceElement
是您想要的类和方法:

public List<Fichier> findAll() {
    StackTraceElement[] stack = Thread.getStackTrace();
    if(stack.length > 1) {
         // stack[0] is ourselves, stack[1] is who called us
         if(stack[1].getClassName().equals(...) && stack[1].getMethodName().equals(...) {
             // execute the business logic
         } 
    }
}
公共列表findAll(){
StackTraceElement[]stack=Thread.getStackTrace();
如果(堆栈长度>1){
//stack[0]是我们自己,stack[1]是呼叫我们的人
如果(堆栈[1].getClassName().equals(…)&堆栈[1].getMethodName().equals(…){
//执行业务逻辑
} 
}
}
请注意以下几点:

  • 这是一个运行时检查,因此调用
    findAll()
    的方法不会在编译时被标记
  • 根据,某些SecurityManager可能不允许使用
    getStackTrace()
    方法,并且在极少数情况下,某些VM可能会忽略堆栈帧
  • 如果对每个请求都执行此操作,则可能无法执行此操作
  • 如果服务是一个Springbean,您可能需要处理通过代理类进行排序以找到真正的调用方(即
    findAll()
    之前的前一个堆栈帧可能是Spring生成的代理类)
另一种方法是使用面向方面的框架。例如,Spring AOP具有可用于匹配调用方名称、类和包的, 但是依赖于一个额外的库。

findAll()
中,您可以使用
Thread.getStackTrace()
检查当前堆栈跟踪,并确保前面的
StackTraceElement
是您想要的类和方法:

public List<Fichier> findAll() {
    StackTraceElement[] stack = Thread.getStackTrace();
    if(stack.length > 1) {
         // stack[0] is ourselves, stack[1] is who called us
         if(stack[1].getClassName().equals(...) && stack[1].getMethodName().equals(...) {
             // execute the business logic
         } 
    }
}
公共列表findAll(){
StackTraceElement[]stack=Thread.getStackTrace();
如果(堆栈长度>1){
//stack[0]是我们自己,stack[1]是呼叫我们的人
如果(堆栈[1].getClassName().equals(…)&堆栈[1].getMethodName().equals(…){
//执行业务逻辑
} 
}
}
请注意以下几点:

  • 这是一个运行时检查,因此调用
    findAll()
    的方法不会在编译时被标记
  • 根据,某些SecurityManager可能不允许使用
    getStackTrace()
    方法,并且在极少数情况下,某些VM可能会忽略堆栈帧
  • 如果对每个请求都执行此操作,则可能无法执行此操作
  • 如果服务是一个Springbean,您可能需要处理通过代理类进行排序以找到真正的调用方(即
    findAll()
    之前的前一个堆栈帧可能是Spring生成的代理类)
另一种方法是使用面向方面的框架。例如,Spring AOP具有可用于匹配调用方名称、类和包的,
但是依赖于一个额外的库。

您可以将
服务
字段移动到一个超类中,并将其声明为
私有
,以防止子类访问它,同时保持
getService()
受保护


或者,您可以在
@products
方法中配置
AlfrescoService
,这样要求注入
AlfrescoService
的每个人都会得到一个已经配置好的实例。

您可以将
service
字段移动到一个超类中,并声明它为
private
,以防止当保持
getService()
受保护时,阻止子类访问它


或者,您可以在
@products
方法中配置
AlfrescoService
,这样每个要求注入
AlfrescoService
的人都会得到一个已经配置好的实例。

您的问题会更深:修改共享服务不是线程安全的。@meriton服务的范围是请求,NO请回答?您的问题更深:修改共享服务不是线程安全的。@meriton服务的范围是请求,请不要回答?