gpt4 book ai didi

Java:基于注释的代码注入(inject)的简单技术?

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:08 24 4
gpt4 key购买 nike

有没有办法让这段代码工作?

登录控件.java

@Audit(AuditType.LOGON)
public void login(String username, String password) {
// do login
}

AuditHandler.java

public void audit(AuditType auditType) {
// persist audit
}

结局是,每次调用 login() 时,也会调用 audit(),并使用适当的 audittype。

我想 AOP 可能是解决这个问题的方法,但我希望它尽可能简单(我看过的 AspectJ 教程通常有非常复杂的注释)。

注意:我不想预先定义调用审计的方法,我正在为一个可扩展的框架编写这个,其他人可能需要使用它。

最佳答案

使用反射很简单,只需用@Audit 注释一个方法,就像 JUnit 中的测试运行器一样:

public interface Login {

void login(String name, String password);
}

public class LoginImpl implements Login {

@Audit(handler = LoginHandler.class)
public void login(String name, String password) {
System.out.println("login");
}

}

@Audit 定义为:

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

Class<? extends Handler> handler();
}

处理程序在哪里:

interface Handler {

void handle();
}

class LoginHandler implements Handler {

public void handle() {
System.out.println("HANDLER CALLED!");
}
}

现在是真正的代码:

public class LoginFactory {

private static class AuditInvocationHandler implements InvocationHandler {

private final Login realLogin;

public AuditInvocationHandler(Login realLogin) {
this.realLogin = realLogin;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Method realMethod = realLogin.getClass().getMethod(
method.getName(),
method.getParameterTypes());
Audit audit = realMethod.getAnnotation(Audit.class);

if (audit != null) {
audit.handler().newInstance().handle();
}

return method.invoke(realLogin, args);
}
}

public static Login createLogin() {
return (Login) Proxy.newProxyInstance(
LoginFactory.class.getClassLoader(),
new Class[]{Login.class},
new AuditInvocationHandler(new LoginImpl()));
}
}

@测试:

    Login login = LoginFactory.createLogin();
login.login("user", "secret");
login.logout();

输出:

HANDLER CALLED!loginlogout

关于Java:基于注释的代码注入(inject)的简单技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1079343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com