0

こんにちは Tapestry plastic は、美しい DSL のおかげでその場でバイトコードを変更することにより、クラスにメタ機能を提供する強力なフレームワークです。

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

ただし、すべてのサンプルとテストのタペストリーでは、人々は groovy を使用しています... Java で使用したいのですが、生成されたオブジェクトで ClassCastException が発生するため、それを行うことができませんか? これはクラスローダーの問題であることは知っていますが、トリックは何ですか?

タペストリー プラスチックをプレーン Java とタペストリー Web フレームワーク以外で使用できますか?

     ...
     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

はい、Java で Plastic を使用できます。それがタペストリーコアで使われている方法です。Javaでは、次のようなことをする必要があります

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

ClassCastException変換されたクラスを Foo クラスに入れようとしているため、取得しています。変換されたクラスは元のクラスから継承されないため、元のクラスにキャストできません。

を使用してインスタンスにアクセスすると、明らかに非常に制限されているなどのメソッドにObjectしかアクセスできません。ここでの秘訣は、インターフェース/実装パターンを使用することです。制御されたクラスに特定のインターフェイスを実装させることができ、そのインターフェイスを使用して新しいオブジェクトにアクセスできます。ObjecttoString()equals()

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

私のブログで他のチュートリアルをチェックアウトして、それがどのように行われるかを見てください。

それが役に立てば幸い!

于 2013-01-08T02:36:48.063 に答える