在运行时将方法名称转换为 bean 名称?

发布于 2024-11-28 21:55:54 字数 754 浏览 1 评论 0 原文

我在当前的项目中经常使用 BeanBinding,因此我的代码看起来像...

TypeA objA;
TypeB objB;
Bindings.createAutoBinding(UpdateStrategy.READ, 
    objA,   BeanProperty.create("X"),
    objB,   BeanProperty.create("X"))
    .bind();

其中 objAobjB 是具有 的类的实例setX() 方法。问题在于,如果我将 setX 重构为 setY,那么我需要寻找这些字符串属性名称。我意识到我可以为属性名称创建静态最终字符串,但如果我能让编译器为我完成这项工作,那就更好了。

理想情况下,我希望能够做的是......

TypeA obja;
TypeB objB;
Bindings.createAutoBinding(UpdateStrategy.READ, 
    objA,   BeanProperty.create( Magic.returnBeanName(TypeA.class).getX() ),
    objB,   BeanProperty.create( Magic.returnBeanName(TypeB.class).setX() )
    .bind();

这似乎可以通过一些代码合成和/或方面来实现。

I am working with BeanBinding a lot in my current project and so I have code that looks like...

TypeA objA;
TypeB objB;
Bindings.createAutoBinding(UpdateStrategy.READ, 
    objA,   BeanProperty.create("X"),
    objB,   BeanProperty.create("X"))
    .bind();

Where objA and objB are instances of classes that have a setX() method. The problem comes in that if I refactor setX to setY then I need to hunt down these string property names. I realize I can create static final strings for property name but if I can get the compiler to do the work for me, all the better.

Ideally, what I would like to be able to do is...

TypeA obja;
TypeB objB;
Bindings.createAutoBinding(UpdateStrategy.READ, 
    objA,   BeanProperty.create( Magic.returnBeanName(TypeA.class).getX() ),
    objB,   BeanProperty.create( Magic.returnBeanName(TypeB.class).setX() )
    .bind();

It would seem this could be possible via some code synthesis and/or aspects.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

骷髅 2024-12-05 21:55:54

完全是在黑暗中拍摄,但也许 returnBeanName 可以使用 javassist 创建一个与 bean 类似的不同类,只不过它将 getter 的返回类型修改为 String 并返回属性名称?

例如,如果您的 bean 如下所示:

public class Foo{
    private int x;

    public int getX(){
        return x;
    }

    public void setX(int x){
        this.x= x;
    }
}

然后动态创建一个如下所示的不同类:

public class FooMeta{
    public String getX(){
        return "x";
    }
}

看起来有点疯狂,但写起来很有趣。

A complete shot in the dark, but maybe returnBeanName can use javassist to create a different class similar to the bean, except that it modifies the return types of the getters to String and returns the property name?

For example, if your bean looks like this:

public class Foo{
    private int x;

    public int getX(){
        return x;
    }

    public void setX(int x){
        this.x= x;
    }
}

Then dynamically create a different class that looks like this:

public class FooMeta{
    public String getX(){
        return "x";
    }
}

Seem kind of crazy, but sounds fun to write.

软糯酥胸 2024-12-05 21:55:54

您可以使用工具:使用 java 代理 href="http://asm.ow2.org/" rel="nofollow">ASM 在编译时访问您的类并生成所需的类/接口/方法。这并不容易,您应该投入时间来学习 java 工具、JVM 字节码和 ASM 库,但您可以用它创造奇迹。

You can use instrumentation: create a java agent using ASM to access your classes at compile time and generate the needed classes/interfaces/methods. It's not easy and you should invest time to learn about java instrumentation, JVM bytecode and the ASM library but you can do wonders with it.

短叹 2024-12-05 21:55:54

我已经完成了类似于 Jeremy Heiler 在我的开源项目 Funcito 中建议的操作,您可以浏览源代码以查看需要执行哪些操作的示例字节码操作,使用Javassist 或 CGLIB。

总体思路是,使用 Javassist 或 CGLIB 中的代码增强器将感兴趣的类代理为具有方法拦截器的子类。您拦截方法调用并记录所调用的方法的名称,然后转身提取所调用的方法名称并按照您的需要使用它。您使用的语义与 Funcito 使用语义非常相似,这与您发布的理想语义非常接近。

I have done something like what Jeremy Heiler suggested in my open source project, Funcito, which you could browse the source code to see an example of what needs to be done to use byte code manipulation, using either Javassist or CGLIB.

The general idea is that you use a code enhancer from Javassist or CGLIB to proxy the class of interest as a subclass which has a method interceptor. You intercept the method call and record the name of the method invoked, and then turn around and extract that invoked method name and use it as you like. The semantics for your use would be very similar to the Funcito usage semantics, which is close to what you posted as your ideal.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文