0

我正在使用 Java 的 MOP 工具 ( JavaMOP ) 来生成在 Android 中运行的方面。
我正在尝试使用 HasNext 示例,该示例仅指定程序始终在迭代器的下一个方法之前调用 hasext 方法。

使用 JavaMOP 生成方面的代码是:

package mop;
import java.io.*;
import java.util.*;
import javamoprt.*;
import java.lang.ref.*;
import org.aspectj.lang.*;

class HasNextMonitor_Set extends javamoprt.MOPSet {
    protected HasNextMonitor[] elementData;

    public HasNextMonitor_Set(){
        this.size = 0;
        this.elementData = new HasNextMonitor[4];
    }

    public final int size(){
        while(size > 0 && elementData[size-1].MOP_terminated) {
            elementData[--size] = null;
        }
        return size;
    }

    public final boolean add(MOPMonitor e){
        ensureCapacity();
        elementData[size++] = (HasNextMonitor)e;
        return true;
    }

    public final void endObject(int idnum){
        int numAlive = 0;
        for(int i = 0; i < size; i++){
            HasNextMonitor monitor = elementData[i];
            if(!monitor.MOP_terminated){
                monitor.endObject(idnum);
            }
            if(!monitor.MOP_terminated){
                elementData[numAlive++] = monitor;
            }
        }
        for(int i = numAlive; i < size; i++){
            elementData[i] = null;
        }
        size = numAlive;
    }

    public final boolean alive(){
        for(int i = 0; i < size; i++){
            MOPMonitor monitor = elementData[i];
            if(!monitor.MOP_terminated){
                return true;
            }
        }
        return false;
    }

    public final void endObjectAndClean(int idnum){
        int size = this.size;
        this.size = 0;
        for(int i = size - 1; i >= 0; i--){
            MOPMonitor monitor = elementData[i];
            if(monitor != null && !monitor.MOP_terminated){
                monitor.endObject(idnum);
            }
            elementData[i] = null;
        }
        elementData = null;
    }

    public final void ensureCapacity() {
        int oldCapacity = elementData.length;
        if (size + 1 > oldCapacity) {
            cleanup();
        }
        if (size + 1 > oldCapacity) {
            HasNextMonitor[] oldData = elementData;
            int newCapacity = (oldCapacity * 3) / 2 + 1;
            if (newCapacity < size + 1){
                newCapacity = size + 1;
            }
            elementData = Arrays.copyOf(oldData, newCapacity);
        }
    }

    public final void cleanup() {
        int numAlive = 0 ;
        for(int i = 0; i < size; i++){
            HasNextMonitor monitor = (HasNextMonitor)elementData[i];
            if(!monitor.MOP_terminated){
                elementData[numAlive] = monitor;
                numAlive++;
            }
        }
        for(int i = numAlive; i < size; i++){
            elementData[i] = null;
        }
        size = numAlive;
    }

    public final void event_hasnext(Iterator i) {
        int numAlive = 0 ;
        for(int i_1 = 0; i_1 < this.size; i_1++){
            HasNextMonitor monitor = (HasNextMonitor)this.elementData[i_1];
            if(!monitor.MOP_terminated){
                elementData[numAlive] = monitor;
                numAlive++;

                monitor.Prop_1_event_hasnext(i);
                if(monitor.Prop_1_Category_fail) {
                    monitor.Prop_1_handler_fail(i);
                }
            }
        }
        for(int i_1 = numAlive; i_1 < this.size; i_1++){
            this.elementData[i_1] = null;
        }
        size = numAlive;
    }

    public final void event_next(Iterator i) {
        int numAlive = 0 ;
        for(int i_1 = 0; i_1 < this.size; i_1++){
            HasNextMonitor monitor = (HasNextMonitor)this.elementData[i_1];
            if(!monitor.MOP_terminated){
                elementData[numAlive] = monitor;
                numAlive++;

                monitor.Prop_1_event_next(i);
                if(monitor.Prop_1_Category_fail) {
                    monitor.Prop_1_handler_fail(i);
                }
            }
        }
        for(int i_1 = numAlive; i_1 < this.size; i_1++){
            this.elementData[i_1] = null;
        }
        size = numAlive;
    }
}

class HasNextMonitor extends javamoprt.MOPMonitor implements Cloneable, javamoprt.MOPObject {
    public Object clone() {
        try {
            HasNextMonitor ret = (HasNextMonitor) super.clone();
            return ret;
        }
        catch (CloneNotSupportedException e) {
            throw new InternalError(e.toString());
        }
    }

    int Prop_1_state;
    static final int Prop_1_transition_hasnext[] = {1, 1, 2};;
    static final int Prop_1_transition_next[] = {2, 0, 2};;

    boolean Prop_1_Category_fail = false;

    public HasNextMonitor () {
        Prop_1_state = 0;

    }

    public final void Prop_1_event_hasnext(Iterator i) {
        MOP_lastevent = 0;

        Prop_1_state = Prop_1_transition_hasnext[Prop_1_state];
        Prop_1_Category_fail = Prop_1_state == 2;
    }

    public final void Prop_1_event_next(Iterator i) {
        MOP_lastevent = 1;

        Prop_1_state = Prop_1_transition_next[Prop_1_state];
        Prop_1_Category_fail = Prop_1_state == 2;
    }

    public final void Prop_1_handler_fail (Iterator i){
        {
            System.err.println("! hasNext() has not been called" + " before calling next() for an" + " iterator");
            this.reset();
        }

    }

    public final void reset() {
        MOP_lastevent = -1;
        Prop_1_state = 0;
        Prop_1_Category_fail = false;
    }

    public javamoprt.ref.MOPWeakReference MOPRef_i;

    //alive_parameters_0 = [Iterator i]
    public boolean alive_parameters_0 = true;

    public final void endObject(int idnum){
        switch(idnum){
            case 0:
            alive_parameters_0 = false;
            break;
        }
        switch(MOP_lastevent) {
            case -1:
            return;
            case 0:
            //hasnext
            //alive_i
            if(!(alive_parameters_0)){
                MOP_terminated = true;
                return;
            }
            break;

            case 1:
            //next
            //alive_i
            if(!(alive_parameters_0)){
                MOP_terminated = true;
                return;
            }
            break;

        }
        return;
    }

}

public aspect HasNextMonitorAspect implements javamoprt.MOPObject {
    javamoprt.map.MOPMapManager HasNextMapManager;
    public HasNextMonitorAspect(){
        HasNextMapManager = new javamoprt.map.MOPMapManager();
        HasNextMapManager.start();
    }

    // Declarations for the Lock
    static Object HasNext_MOPLock = new Object();

    static boolean HasNext_activated = false;

    // Declarations for Indexing Trees
    static javamoprt.map.MOPBasicRefMapOfMonitor HasNext_i_Map = new javamoprt.map.MOPBasicRefMapOfMonitor(0);
    static javamoprt.ref.MOPWeakReference HasNext_i_Map_cachekey_0 = javamoprt.map.MOPBasicRefMapOfMonitor.NULRef;
    static HasNextMonitor HasNext_i_Map_cachenode = null;

    // Trees for References
    static javamoprt.map.MOPRefMap HasNext_Iterator_RefMap = HasNext_i_Map;

    pointcut MOP_CommonPointCut() : !within(javamoprt.MOPObject+) && !adviceexecution();
    pointcut HasNext_hasnext(Iterator i) : (call(* Iterator.hasNext()) && target(i)) && MOP_CommonPointCut();
    after (Iterator i) : HasNext_hasnext(i) {
    try{
        HasNext_activated = true;
        synchronized(HasNext_MOPLock) {
            HasNextMonitor mainMonitor = null;
            javamoprt.map.MOPMap mainMap = null;
            javamoprt.ref.MOPWeakReference TempRef_i;

            // Cache Retrieval
            if (i == HasNext_i_Map_cachekey_0.get()) {
                TempRef_i = HasNext_i_Map_cachekey_0;

                mainMonitor = HasNext_i_Map_cachenode;
            } else {
                TempRef_i = HasNext_i_Map.getRef(i);
            }

            if (mainMonitor == null) {
                mainMap = HasNext_i_Map;
                mainMonitor = (HasNextMonitor)mainMap.getNode(TempRef_i);

                if (mainMonitor == null) {
                    mainMonitor = new HasNextMonitor();

                    mainMonitor.MOPRef_i = TempRef_i;

                    HasNext_i_Map.putNode(TempRef_i, mainMonitor);
                }

                HasNext_i_Map_cachekey_0 = TempRef_i;
                HasNext_i_Map_cachenode = mainMonitor;
            }

            mainMonitor.Prop_1_event_hasnext(i);
            if(mainMonitor.Prop_1_Category_fail) {
                mainMonitor.Prop_1_handler_fail(i);
            }
        }
        }catch(Exception e){
                    System.out.println("Cause: "+e.getCause().toString());
                    System.out.println("Error:"+e.getLocalizedMessage());
                }
    }

    pointcut HasNext_next(Iterator i) : (call(* Iterator.next()) && target(i)) && MOP_CommonPointCut();
    before (Iterator i) : HasNext_next(i) {
        try{
        HasNext_activated = true;
        synchronized(HasNext_MOPLock) {
            HasNextMonitor mainMonitor = null;
            javamoprt.map.MOPMap mainMap = null;
            javamoprt.ref.MOPWeakReference TempRef_i;

            // Cache Retrieval
            if (i == HasNext_i_Map_cachekey_0.get()) {
                TempRef_i = HasNext_i_Map_cachekey_0;

                mainMonitor = HasNext_i_Map_cachenode;
            } else {
                TempRef_i = HasNext_i_Map.getRef(i);
            }

            if (mainMonitor == null) {
                mainMap = HasNext_i_Map;
                mainMonitor = (HasNextMonitor)mainMap.getNode(TempRef_i);

                if (mainMonitor == null) {
                    mainMonitor = new HasNextMonitor();

                    mainMonitor.MOPRef_i = TempRef_i;

                    HasNext_i_Map.putNode(TempRef_i, mainMonitor);
                }

                HasNext_i_Map_cachekey_0 = TempRef_i;
                HasNext_i_Map_cachenode = mainMonitor;
            }

            mainMonitor.Prop_1_event_next(i);
            if(mainMonitor.Prop_1_Category_fail) {
                mainMonitor.Prop_1_handler_fail(i);
            }
        }
    }catch(Exception e){
                    System.out.println("Cause: "+e.getCause().toString());
                    System.out.println("Error:"+e.getLocalizedMessage());
                }
    }

    after(Iterator i) throwing (Exception e): HasNext_next(i) {
      System.out.println("Threw an exception: " + e);
      }
    after(Iterator i) throwing (Exception e): HasNext_hasnext(i) {
      System.out.println("Threw an exception: " + e);
      }

}

}

我的Android项目中的方法是:

public void method1() {
        Vector<Integer> v = new Vector<Integer>();
        v.add(1);
        v.add(2);
        v.add(3);
        v.add(4);
        Iterator<Integer> i = v.iterator();
        int sum = 0;
        if (i.hasNext()) {
            sum += (Integer) i.next();
            sum += (Integer) i.next();
            sum += (Integer) i.next();
            sum += (Integer) i.next();
        }
        System.out.println("sum: " + sum);
}

用切面编织Android项目并执行该方法后,应用程序抛出以下异常:

E/AndroidRuntime(2334): FATAL EXCEPTION: main
E/AndroidRuntime(2334): org.aspectj.lang.NoAspectBoundException: Exception while initializing mop_HasNextMonitorAspect: java.lang.ExceptionInInitializerError
E/AndroidRuntime(2334):     at mop.HasNextMonitorAspect.aspectOf(HasNextMonitorAspect.aj:1)
E/AndroidRuntime(2334):     at com.mopapplication.MOPApplicationActivity.method1(Unknown Source)
E/AndroidRuntime(2334):     at com.mopapplication.MOPApplicationActivity$3.onClick(Unknown Source)
E/AndroidRuntime(2334):     at android.view.View.performClick(View.java:3122)
E/AndroidRuntime(2334):     at android.view.View$PerformClick.run(View.java:11942)
E/AndroidRuntime(2334):     at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(2334):     at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(2334):     at android.os.Looper.loop(Looper.java:132)
E/AndroidRuntime(2334):     at android.app.ActivityThread.main(ActivityThread.java:4028)
E/AndroidRuntime(2334):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(2334):     at java.lang.reflect.Method.invoke(Method.java:491)
E/AndroidRuntime(2334):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
E/AndroidRuntime(2334):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
E/AndroidRuntime(2334):     at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(2334): Caused by: java.lang.ExceptionInInitializerError
E/AndroidRuntime(2334):     at java.lang.management.ManagementFactory.getOperatingSystemMXBean(ManagementFactory.java:409)
E/AndroidRuntime(2334):     at javamoprt.map.MOPMapManager.<init>(Unknown Source)
E/AndroidRuntime(2334):     at mop.HasNextMonitorAspect.<init>(HasNextMonitorAspect.aj:231)
E/AndroidRuntime(2334):     at mop.HasNextMonitorAspect.ajc$postClinit(HasNextMonitorAspect.aj:1)
E/AndroidRuntime(2334):     at mop.HasNextMonitorAspect.<clinit>(HasNextMonitorAspect.aj:228)
E/AndroidRuntime(2334):     ... 13 more
E/AndroidRuntime(2334): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load management: findLibrary returned null
E/AndroidRuntime(2334):     at java.lang.Runtime.loadLibrary(Runtime.java:425)
E/AndroidRuntime(2334):     at java.lang.System.loadLibrary(System.java:554)
E/AndroidRuntime(2334):     at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:50)
E/AndroidRuntime(2334):     at java.security.AccessController.doPrivileged(AccessController.java:116)
E/AndroidRuntime(2334):     at java.security.AccessController.doPrivileged(AccessController.java:85)
E/AndroidRuntime(2334):     at sun.management.ManagementFactory.<clinit>(ManagementFactory.java:467)
E/AndroidRuntime(2334):     ... 18 more

我知道这不是库的问题,因为我在 Android 项目中包含了 AspectJ、JavaMOP 和 Java 运行时库(对于 Java 运行时库,我只包含必要的类和包,而不是全部图书馆)。

知道有什么问题吗?

提前致谢。

4

1 回答 1

1

从堆栈跟踪我们可以读到您正在使用的库正在尝试加载“管理”库。该库包含在 sun(现在的 Oracle)jdk 中,但不是 android 的一部分。我猜你在android中使用这个lib不会有任何运气,因为它依赖于android中不包含的管理东西,比如SNMP。

于 2012-05-31T11:04:48.117 回答