3

com.rits.cloningorg.objenesis.*libs を使用してオブジェクトをディープクローンするAndroidアプリを開発しています。目的は、元のオブジェクトが同じオブジェクトを参照していることを気にせずに、ツリー構造クラスに同じオブジェクトを 2 回以上追加することです。通常clone()はオブジェクトを浅いコピーするだけなので、前述のライブラリを使用します。

Android プロジェクトを開発する前に、ツリーを実装する Java プロジェクトを作成しましたが、それらのライブラリを使用して正常に動作しました。次に、それをAndroidプロジェクトにインポートしました(またcom.rits.cloningorg.objenesis.*を外部ライブラリとして追加し、両方のライブラリをチェックしますJava Build Path > Order and Export)。しかし、それを実行すると、呼び出しdeepClone()た行で、このエラーが LogCat に表示され、アプリが強制的に閉じられます。

E/AndroidRuntime(280): FATAL EXCEPTION: main
E/AndroidRuntime(280): java.lang.NoClassDefFoundError: sun.reflect.ReflectionFactory
E/AndroidRuntime(280):  at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.<init>(SunReflectionFactoryInstantiator.java:40)
E/AndroidRuntime(280):  at org.objenesis.strategy.StdInstantiatorStrategy.newInstantiatorOf(StdInstantiatorStrategy.java:85)
E/AndroidRuntime(280):  at org.objenesis.ObjenesisBase.getInstantiatorOf(ObjenesisBase.java:90)
E/AndroidRuntime(280):  at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73)
E/AndroidRuntime(280):  at com.rits.cloning.Cloner.newInstance(Cloner.java:291)
E/AndroidRuntime(280):  at com.rits.cloning.Cloner.cloneInternal(Cloner.java:468)
E/AndroidRuntime(280):  at com.rits.cloning.Cloner.deepClone(Cloner.java:327)
E/AndroidRuntime(280):  at com.*.project_monitoring.project.WBS.add(WBS.java:35)
E/AndroidRuntime(280):  at com.*.project_monitoring.project.ProjectUtility.demoPlan(ProjectUtility.java:101)
E/AndroidRuntime(280):  at com.*.project_monitoring.ProjectSelection.onCreate(ProjectSelection.java:45)
E/AndroidRuntime(280):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(280):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(280):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(280):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(280):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(280):  at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(280):  at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(280):  at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(280):  at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(280):  at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(280):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(280):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(280):  at dalvik.system.NativeStart.main(Native Method)

私はグーグルでこれを個別に試しました:

  • プロジェクトをきれいにする
  • com.rits.cloningとをビルド パスから削除しorg.objenesis.*、readd
  • これらのライブラリを並べ替えて、Android 依存関係のすぐ下に配置します
  • これらのライブラリを並べ替えて、すべてのライブラリの上に配置します

これが起こる数週間前に更新したので、Eclipseの更新が原因ではないと思います。

ソースコードは次のとおりです。

package com.*.tree;

import java.util.ArrayList;
import com.rits.cloning.Cloner;

public class MyTree {
    Data o;
    MyTree parent;
    ArrayList<MyTree> child = new ArrayList<MyTree>();

    public void add(MyTree tree) {
        Cloner c = new Cloner();

        MyTree temp =   c.deepClone(tree); //this is where the app crashed
        temp.parent = this;
        child.add(temp);
    }

    public static void main(String[] args) {
        MyTree tree1 = new MyTree();
        MyTree tree2 = new MyTree();

        tree1.add(tree2);
        tree1.add(tree2);
        tree1.add(tree2);
        //The result wanted here is tree1 has 3 different but identical child objects
        //NOT 3 child which refer to the same one object
    }
}

class Data {
    double value;
}

質問:

  • なぜそのエラーが発生し、どうすればそれを取り除くことができますか?
  • 私のツリーを実装する他の方法はありますか?

私の英語を許してください。

ありがとうございました :)

4

1 に答える 1

1

Eclipse で、[Java ビルド パス] ダイアログに外部ライブラリを追加するときは、[注文とエクスポート] タブにも切り替えて、リストでそのライブラリの名前にチェックマークを付けることを忘れないでください。これは、ライブラリがコンパイル時だけでなく実行時に見つかるようにするために必要です。

Ant でインストルメンテーション テストを実行すると NoClassDefFoundError が発生する

于 2012-09-08T22:01:12.060 に答える