Hi Tapestry plastic是一个功能强大的框架,它通过动态修改字节码来提供类的元功能,感谢美丽的dsl。
http://tawus.wordpress.com/2011/04/18/meeting-plastic/
然而,在所有样本和测试tapestry人员使用groovy ...我想使用它与java但我从来没有设法这样做,因为生成的对象上的ClassCastException?我知道这是一个类加载器问题但是诀窍是什么?
我们可以使用挂毯塑料和普通的java和外部挂毯网络框架吗?
...
PlasticManager pm = PlasticManager.withContextClassLoader().packages ( Arrays.asList( "plastic" )).
delegate(new StandardDelegate(new ToStringTransformer())).create();
Foo foo = (Foo) pm.getClassInstantiator("plastic.controlled.Foo").newInstance();
...
这将返回ClassCastException。
答案 0 :(得分:3)
是的,你可以使用Plastic with Java。这就是它在Tapestry核心中的使用方式。在java中你必须做类似
的事情Object foo = pm.getClassInstantiator("plastic.controlled.Foo").newInstance()
您正在获得ClassCastException
因为您正在尝试将已转换的类放入Foo类中。转换后的类不是从原始类继承的,因此无法将其转换为它。
使用Object
访问实例时,您只能访问Object
,toString()
等equals()
方法,这显然非常有限。这里的技巧是使用接口/实现模式。您可以让受控类实现给定的接口,然后您可以使用该接口访问新对象。
MyInterface myInterface = (MyInterface)pm.getClassInstantiator(
"plastic.controlled.Foo").newInstance()
查看我博客上的其他教程,看看是如何完成的。
希望它有所帮助!