我目前正在开发一个应用程序,我希望有可以用作回调的带注释的函数。
历史 当我以前进行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;
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在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
注解,并相应地调用了它们。但是,请注意,这种方法较为低效且不够灵活,特别是当需要根据特定条件或事件触发不同的方法时。对于更复杂的逻辑,可能需要设计一个事件处理器或者策略模式等更高级的设计模式来处理。