如果没有classcastexception,可以使用Tapestry Plastic和普通的java(没有groovy)

时间:2013-01-08 00:09:20

标签: tapestry

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。

1 个答案:

答案 0 :(得分:3)

是的,你可以使用Plastic with Java。这就是它在Tapestry核心中的使用方式。在java中你必须做类似

的事情
Object foo = pm.getClassInstantiator("plastic.controlled.Foo").newInstance()

您正在获得ClassCastException因为您正在尝试将已转换的类放入Foo类中。转换后的类不是从原始类继承的,因此无法将其转换为它。

使用Object访问实例时,您只能访问ObjecttoString()equals()方法,这显然非常有限。这里的技巧是使用接口/实现模式。您可以让受控类实现给定的接口,然后您可以使用该接口访问新对象。

MyInterface myInterface = (MyInterface)pm.getClassInstantiator(
    "plastic.controlled.Foo").newInstance()

查看我博客上的其他教程,看看是如何完成的。

希望它有所帮助!