Java + Reflection:调用变量访问方法。可能吗?

时间:2010-10-22 16:05:39

标签: java reflection properties

我想知道是否有可能,使用反射或类似的方法在读取或写入模式下访问变量时调用方法。简而言之,我的目标与C#属性的行为类似。

示例:假设我有两个A和B类......

public class A{
    public int field;

    public void foo(){ System.out.println("Field modified");}
}

public class B{
    public void bar(A a){
        a.field = 1;
    }
}

...我想在编写a.field时执行方法A.foo()。

这在Java中是否可以实现?

提前致谢

P.S。我知道好的编程实践建议使用getter和setter。我只需要知道我想做什么是可行的。

AC

3 个答案:

答案 0 :(得分:7)

不通过反射 - 反射只是让您在运行时访问有关类/字段/等的静态信息。

Aspect oriented programming更多的是你想到的 - 这可以让你在源代码的某些点注入少量代码(称为“建议”)(例如在方法运行之前,当一个字段是设置等)。这几乎肯定会让你做你想要的。

虽然有一点警告 - 正如你似乎提到的那样,依靠方面来处理你​​的一般逻辑不太可能是一个好主意,因为它很难用它们来理解,并且确切地知道将会发生什么(通过定义,它们打破默认的心理模型,调用方法foo()意味着控件直接传递给该方法)。对于像日志记录或调试这样的事情,AOP非常强大,因为它可以让您编写一些代码,这些代码可以轻松地影响许多交叉问题,并且不需要您修改代码底层应用程序。您的建议可以根据需要进行编织,并在不需要时将其遗漏。

答案 1 :(得分:3)

  

我想知道是否有可能,使用反射或类似的方法在读取或写入模式下访问变量时调用方法。

是。如果使用getter和setter方法正确封装数据,可以将这些代码放在这些方法中,或者在子类中覆盖这些方法。

(现在我看到了你的ps) - 不,没有办法用反射解决这个问题。如果我被问(强迫?)来解决这个问题,我会编写自己的类加载器,也许使用ASM框架,并用正确的getter / setter方法调用替换每个get-field / set-field指令

他们实际上有一个FAQ条目,有一个解决方案:

答案 2 :(得分:0)

AFAIK,你不能用Java做到这一点。如你所说,使用getter和setter。

相关问题