Я пытаюсь добавить функциональность в сигнатуру метода интерфейса с помощью аннотаций.
идея состоит в том, чтобы вызывать некоторые другие методы для каждого аннотированного.
например, если у меня есть подпись этого метода:
public interface IMyInterface{
@Entity(visibileName = "Name")
public TextField getName();
}
Мне нужно вызвать метод, который печатает имя строки до и после этого метода. также, если есть способ определить функциональность этого метода во время выполнения.
Я также открыт для структурных изменений.




Если вы хотите аннотировать методы interface, то это возможен без АОП.
Просто используйте Динамические прокси!
База interface для реализации прокси InvocationHandler
InvocationHandler is the interface implemented by the invocation handler of a proxy instance.
Следите за комментариями в коде.
static class MyInterfaceProxy implements InvocationHandler {
private static final Map<String, Method> METHODS = new HashMap<>(16);
static {
// Scan each interface method for the specific annotation
// and save each compatible method
for (final Method m : IMyInterface.class.getDeclaredMethods()) {
if (m.getAnnotation(YourAnnotation.class) != null) {
METHODS.put(m.getName(), m);
}
}
}
private final IMyInterface toBeProxied;
private MyInterfaceProxy(final IMyInterface toBeProxied) {
// Accept the real implementation to be proxied
this.toBeProxied = toBeProxied;
}
@Override
public Object invoke(
final Object proxy,
final Method method,
final Object[] args) throws InvocationTargetException, IllegalAccessException {
// A method on MyInterface has been called!
// Check if we need to call it directly or if we need to
// execute something else before!
final Method found = METHODS.get(method.getName());
if (found != null) {
// The method exist in our to-be-proxied list
// Execute something and the call it
// ... some other things
System.out.println("Something else");
}
// Invoke original method
return method.invoke(toBeProxied, args);
}
}
Чтобы использовать эту InvocationHandler реализацию, вам нужен реальный экземпляр объекта для проксирования.
Допустим, у вас есть Фабрика для MyInterface реализаций.
MyInterface getMyInsterface() {
...
final MyInterface instance = ...
// Create the proxy and inject the real implementation
final IMyInterface proxy = (IMyInterface) Proxy.newProxyInstance(
MyInterfaceProxy.class.getClassLoader(),
new Class[] {IMyInterface.class},
new MyInterfaceProxy(instance) // Inject the real instance
);
// Return the proxy!
return proxy;
}
Proxy.newProxyInstance, можете ли вы дать мне полную реализацию этого метода? какое полное имя для этого класса, что такое файл jar?
@AliTaha Это стандартный метод в JDK. Уже сделано!
Я не уверен, что все, что вы пытаетесь сделать, можно сделать таким образом, но вы можете взглянуть на АОП.