我想在 Java 中创建这样的对象,它将包含一些“调度程序”函数,如 Object getAttr(String name)
,它将接收所有属性访问尝试 - 所以,如果我做 System.out.print(myObj.hello)
,实际代码将被翻译成类似System.out.print(myObj.getAttr('hello'))
,如果我将执行 myObj.hello = 123
,它应该执行为 myObj.setAttr('hello', 123)
。请注意,我应该能够使用任何属性名称,我事先不知道可能的名称列表。
那么,在这种情况下,有可能吗?
UPD#1:我正在为 JVM 编写新语言(某种程度上类似于 (J|P)ython,所以我们称它为 Jython),旨在实现非常紧密的 Java 集成。所需的设计功能之一是能够通过键入 jythonObject.some_attribute
从 Java 代码无缝访问 Jython 对象属性。所以这是交易。
关闭:通过 AspectJ 使用 AOP 似乎是唯一可能的解决方案,所以感谢大家的帮助,尤其是 Thomas 的最广泛的回答:)
最佳答案
不可能使用纯 Java,除非通过:
字节码操作
例如使用 AspectJ。
注释处理器
使用自定义注解处理器,其实也是一种字节码操作。 Projekt Lombok正在做这样的事情。
合成访问器方法
也就是说,如果代码无论如何都使用合成访问器方法(在这种情况下,理论上您可以创建代理):
public class Test {
public static void main(String... args) {
TestClass t = new TestClass();
// this is actually calling a synthetic accessor method
t.hello = "x";
}
static class TestClass {
private String hello;
}
}
关于java - 拦截Java字段和方法访问,创建代理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6254276/