0

嗨 Tapestry 塑料是一个强大的框架,它通过动态修改字节码来提供类元功能,这要感谢漂亮的 dsl。

http://tawus.wordpress.com/2011/04/18/meeting-plastic/

然而,在所有样本和测试挂毯中,人们都使用 groovy ......我想将它与 java 一起使用,但由于生成的对象上的 ClassCastException 而我从未设法这样做?我知道这是一个类加载器问题,但诀窍是什么?

我们可以使用带有普通 Java 和外部 Tapestry Web 框架的 Tapestry Plastic 吗?

     ...
     PlasticManager pm = PlasticManager.withContextClassLoader().packages (  Arrays.asList( "plastic" )).
     delegate(new StandardDelegate(new ToStringTransformer())).create();


     Foo foo = (Foo) pm.getClassInstantiator("plastic.controlled.Foo").newInstance();

     ...

这将返回一个 ClassCastException。

4

1 回答 1

3

是的,您可以将 Plastic 与 Java 一起使用。这就是它在 Tapestry 核心中的使用方式。在java中你必须做类似的事情

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

您得到 a 是ClassCastException因为您试图将转换后的类放入 Foo 类中。转换后的类不是从原始类继承的,因此不能转换为它。

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

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

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

希望能帮助到你!

于 2013-01-08T02:36:48.063 回答