Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过注释引用方法_Java - Fatal编程技术网

Java 通过注释引用方法

Java 通过注释引用方法,java,Java,最近我想了一个问题,你有一个方法可以执行某种操作,但是不应该直接调用它,而是通过另一个方法来正确处理它 所以我一直想做的是创建一个注释,在注释中包含要使用的方法,即: @NonDirectUsage(direct=MyClass.directMethod); 它必须类似于可以链接引用的注释,但是,我想这样使用它,以便在运行时进一步使用它,等等 实时代码中的示例如下所示: List<Integer> myList = new ArrayList<>(); @Overr

最近我想了一个问题,你有一个方法可以执行某种操作,但是不应该直接调用它,而是通过另一个方法来正确处理它

所以我一直想做的是创建一个注释,在注释中包含要使用的方法,即:

 @NonDirectUsage(direct=MyClass.directMethod);
它必须类似于可以链接引用的注释,但是,我想这样使用它,以便在运行时进一步使用它,等等

实时代码中的示例如下所示:

List<Integer> myList = new ArrayList<>();

@Override
@NonDirectUsage(direct=addToList)
public void add(T t) {
    super.add(t);
}

public void addToList(Integer i) {
   System.out.println("added integer properly: "+i);
   add(i);
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface NonDirectUsage {
}
List myList=new ArrayList();
@凌驾
@非定向(直接=添加列表)
公共无效添加(T){
super.add(t);
}
公共void addToList(整数i){
System.out.println(“正确添加整数:+i”);
加(i);
}

有什么方法可以做到这一点吗?

如果您使用的是Spring,那么可以使用AOP

e、 例如,您的注释看起来像:

List<Integer> myList = new ArrayList<>();

@Override
@NonDirectUsage(direct=addToList)
public void add(T t) {
    super.add(t);
}

public void addToList(Integer i) {
   System.out.println("added integer properly: "+i);
   add(i);
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface NonDirectUsage {
}
然后定义一个方面

@Aspect
public class NonDirectUsageAspect{

    @Around("@annotation(NonDirectUsage)")
    public Object addToList(ProceedingJoinPoint joinPoint) throws Throwable {
       System.out.println("added integer properly: ");
       return null;
   }
}
不要忘记配置代码来处理方面

@Configuration  
@EnableAspectJAutoProxy
public class NoDirectUsageConfig {}

我认为如果你使用JakartaEE,你也可以做类似的事情。

为什么你会以这种方式将
add
的用法结合起来<代码>添加不应该知道/关心谁调用它。你会从中得到什么好处?@VinceEmigh我很确定这只是一个如何使用它的示例,而不是一种特别有用的方法。当然,一种方法是使用反射,而不是使用实际引用,而是使用一个作为方法名的字符串。“有一个执行某种操作的方法,但不应该直接调用它,而应该通过另一个正确处理它的方法来调用。”-这听起来不像是对您的委托?访问修饰符的存在是为了限制访问。功能的存在是为了解决问题-我要问的是,您实际要解决的问题是什么。您不应该”创建实际上不能解决任何问题的“功能”。如果存在实际问题,很有可能存在解决方案。这听起来像是一个,这就是为什么我问你可以使用
@Deprecated
自定义消息将它们指向正确的方法,请参阅此问题: