在运行时将方法名称转换为 bean 名称?
我在当前的项目中经常使用 BeanBinding,因此我的代码看起来像...
TypeA objA;
TypeB objB;
Bindings.createAutoBinding(UpdateStrategy.READ,
objA, BeanProperty.create("X"),
objB, BeanProperty.create("X"))
.bind();
其中 objA
和 objB
是具有 的类的实例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();
这似乎可以通过一些代码合成和/或方面来实现。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
完全是在黑暗中拍摄,但也许
returnBeanName
可以使用 javassist 创建一个与 bean 类似的不同类,只不过它将 getter 的返回类型修改为 String 并返回属性名称?例如,如果您的 bean 如下所示:
然后动态创建一个如下所示的不同类:
看起来有点疯狂,但写起来很有趣。
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:
Then dynamically create a different class that looks like this:
Seem kind of crazy, but sounds fun to write.
您可以使用工具:使用 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.
我已经完成了类似于 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.