java - 拦截Java字段和方法访问,创建代理对象

标签 java attributes proxy introspection intercept

我想在 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/

相关文章:

angular - 带有用于 https 域的 NGINX proxy_pass 的 Webpack Dev Server 原因:net::ERR_CONNECTION_CLOSED

java - 大数据微基准测试

java - 照片由相机上传异常(Firebase 存储)

java - GradlecompileTestJava 在 gradle clean 构建期间失败

c# - 在 C# 中使用十进制值作为属性参数?

http - HTTP header 中的Connection和Proxy-connection有什么区别?

proxy - 从 XSD 生成类型/类的参数化构造函数

java - 令人沮丧的 ElementNotVisibleException 错误

asp.net-mvc-3 - Ninject 绑定(bind)属性以使用构造函数参数进行过滤

jsp - 使用表达式语言设置 session 属性