2012-09-08 31 views
3

我正在開發一個Android應用程序,它使用com.rits.cloningorg.objenesis.*庫來深入克隆對象。 目的是將相同的對象添加到我的樹結構類中兩次或更多,而不用擔心原始對象引用的是同一個對象。 由於正常clone()只是淺拷貝對象,我使用提到的庫。在Android上使用目標時出現NoClassDefFoundError

在開發android項目之前,我創建了一個java項目來實現我的樹,它使用這些庫很好。 然後我將它導入到android項目中(並且還添加了com.rits.cloning,org.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.susterblonde.project_monitoring.project.WBS.add(WBS.java:35) 
E/AndroidRuntime(280): at com.susterblonde.project_monitoring.project.ProjectUtility.demoPlan(ProjectUtility.java:101) 
E/AndroidRuntime(280): at com.susterblonde.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.cloningorg.objenesis.*並重新進行添加
  • 重新排列這些庫,使他們在正下方Android的依賴
  • 重新排列這些庫,使他們對所有庫

的頂部,我不認爲這是因爲Eclipse更新,因爲我幾個星期更新之前,這種情況發生。

這裏的源代碼:

package com.susterblonde.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; 
} 

問:

  • 爲什麼我得到的錯誤,我該如何擺脫它?
  • 有沒有其他方法來實現我的樹?

請原諒我的英語。

謝謝:)

回答

1

在Eclipse中,當你在Java中添加外部庫構建路徑對話框中,不要忘了也切換到訂單和出口標籤,在列表中勾選該庫的名稱。這是需要的,以便在運行時找到庫,而不僅僅是在編譯時。

NoClassDefFoundError when running Instrumentation test with ant

+0

THX,但我做到了,仍然錯誤 –

+0

謝謝,我包括了答案也是如此。 – Levon

相關問題