开发者社区 问答 正文

将注解功能解析为参数java

我目前正在开发一个应用程序,我希望有可以用作回调的带注释的函数。

历史 当我以前进行Swift开发时,我记得使用某些函数作为参数,您需要运行@objc。 我想做类似的事情并使用@Function。

当前代码

函数.java

package com.iprogrammer.annotations;

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Target;

    @Target(value={ElementType.METHOD})
    public @interface Function{

    }

App.java

package dev.davidkeen.annotations;

import java.lang.annotation.Annotation;

public final class App {
    private App() {
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.run();
    }
}


class Main{
    public Main(){}

    public void run(){
        someFunc(someFunc2);
    }

    void someFunc(Function function){
        function();
    }

    @Function void someFuncTwo(){
        System.out.println("Hello");
    }
}

可以解析someFuncTwo为a的参数someFunc吗?

编辑

我要使用注释的原因是以下用法

class AdminController{
  private AdminModdle _moddle;
  private JFrame _view;

  public AdminController{
     _view.buttonOne.setAction(actionOne);
     _view.buttonTwo.setAction(actionTwo);
  }

  @Function void actionOne(){
    //Do stuff
  }

  @Function void actionTwo(){
    //Do Stuff
  }

  public JFrame getView(){
    return _view;
  }
}

展开
收起
垚tutu 2019-12-04 17:03:27 627 分享 版权
阿里云 AI 助理回答

在Java中,注解(Annotation)不能直接用作函数回调。注解主要用于提供元数据,它们不会直接影响程序的运行时行为。你不能像Swift中的@objc那样直接通过注解来标记一个方法以供其他地方作为函数对象使用。

不过,你可以通过反射(Reflection)来检查类的方法上是否存在特定的注解,然后基于这个信息动态地决定是否调用该方法。但请注意,这仍然需要你手动管理这些方法的调用逻辑,而不是让注解直接变成可调用的函数引用。

下面是一个简化的示例,展示了如何使用反射和自定义注解来检查并执行带有特定注解的方法:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Function {
}

public class Main {

    public static void main(String[] args) throws Exception {
        AdminController controller = new AdminController();
        
        // 使用反射获取所有方法
        for (Method method : controller.getClass().getDeclaredMethods()) {
            // 检查方法是否有@Function注解
            if (method.isAnnotationPresent(Function.class)) {
                // 调用带有@Function注解的方法
                method.invoke(controller);
            }
        }
    }
}

class AdminController {

    public AdminController() {
    }

    @Function
    public void actionOne() {
        System.out.println("Action One");
    }

    @Function
    public void actionTwo() {
        System.out.println("Action Two");
    }
}

在这个例子中,我们遍历了AdminController的所有方法,检查是否有@Function注解,并相应地调用了它们。但是,请注意,这种方法较为低效且不够灵活,特别是当需要根据特定条件或事件触发不同的方法时。对于更复杂的逻辑,可能需要设计一个事件处理器或者策略模式等更高级的设计模式来处理。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答