vmreflection.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 421 行 · 第 1/2 页

JAVA
421
字号
/**
 * $Id: VmReflection.java,v 1.7 2004/02/17 19:15:53 epr Exp $
 */
package org.jnode.vm;

import java.lang.reflect.InvocationTargetException;

import org.jnode.vm.classmgr.VmField;
import org.jnode.vm.classmgr.VmInstanceField;
import org.jnode.vm.classmgr.VmMethod;
import org.jnode.vm.classmgr.VmStaticField;
import org.jnode.vm.classmgr.VmType;
import org.jnode.vm.memmgr.*;

/**
 * <description>
 * 
 * @author epr
 */
public class VmReflection {

    public static Object getObject(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return Unsafe.getObject(getStaticFieldAddress(sf));
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getObject(o, inf.getOffset());
        }
    }

    public static boolean getBoolean(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return (Unsafe.getInt(getStaticFieldAddress(sf)) != 0);
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getBoolean(o, inf.getOffset());
        }
    }

    public static byte getByte(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return (byte) Unsafe.getInt(getStaticFieldAddress(sf));
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getByte(o, inf.getOffset());
        }
    }

    public static char getChar(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return (char) Unsafe.getInt(getStaticFieldAddress(sf));
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getChar(o, inf.getOffset());
        }
    }

    public static short getShort(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return (short) Unsafe.getInt(getStaticFieldAddress(sf));
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getShort(o, inf.getOffset());
        }
    }

    public static int getInt(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return Unsafe.getInt(getStaticFieldAddress(sf));
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getInt(o, inf.getOffset());
        }
    }

    public static float getFloat(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return Unsafe.getFloat(getStaticFieldAddress(sf));
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getFloat(o, inf.getOffset());
        }
    }

    public static long getLong(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return Unsafe.getLong(getStaticFieldAddress(sf));
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getLong(o, inf.getOffset());
        }
    }

    public static double getDouble(VmField field, Object o) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            return Unsafe.getDouble(getStaticFieldAddress(sf));
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            return Unsafe.getDouble(o, inf.getOffset());
        }
    }

    public static void setObject(VmField field, Object o, Object value) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            Unsafe.setObject(getStaticFieldAddress(sf), value);
            final VmWriteBarrier wb = Vm.getVm().getHeapManager()
                    .getWriteBarrier();
            if (wb != null) {
                wb.putstaticWriteBarrier(sf.getStaticsIndex(), value);
            }
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            final int offset = inf.getOffset();
            Unsafe.setObject(o, offset, value);
            final VmWriteBarrier wb = Vm.getVm().getHeapManager()
                    .getWriteBarrier();
            if (wb != null) {
                wb.putfieldWriteBarrier(o, offset, value);
            }
        }
    }

    public static void setBoolean(VmField field, Object o, boolean value) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            Unsafe.setInt(getStaticFieldAddress(sf), value ? 1 : 0);
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            Unsafe.setBoolean(o, inf.getOffset(), value);
        }
    }

    public static void setByte(VmField field, Object o, byte value) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            Unsafe.setInt(getStaticFieldAddress(sf), value);
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            Unsafe.setByte(o, inf.getOffset(), value);
        }
    }

    public static void setChar(VmField field, Object o, char value) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            Unsafe.setInt(getStaticFieldAddress(sf), value);
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            Unsafe.setChar(o, inf.getOffset(), value);
        }
    }

    public static void setShort(VmField field, Object o, short value) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            Unsafe.setInt(getStaticFieldAddress(sf), value);
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            Unsafe.setShort(o, inf.getOffset(), value);
        }
    }

    public static void setInt(VmField field, Object o, int value) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            Unsafe.setInt(getStaticFieldAddress(sf), value);
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            Unsafe.setInt(o, inf.getOffset(), value);
        }
    }

    public static void setFloat(VmField field, Object o, float value) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;
            initialize(sf);
            Unsafe.setFloat(getStaticFieldAddress(sf), value);
        } else {
            final VmInstanceField inf = (VmInstanceField) field;
            Unsafe.setFloat(o, inf.getOffset(), value);
        }
    }

    public static void setLong(VmField field, Object o, long value) {
        if (field.isStatic()) {
            final VmStaticField sf = (VmStaticField) field;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?