public final class Class {

    private Class() {}

    public static native Class forName(String className) throws
            ClassNotFoundException;

    public native Object newInstance() throws InstantiationException,
            IllegalAccessException;

    public native boolean isInstance(Object obj);

    public native boolean isAssignableFrom(Class cls);

    public native boolean isInterface();

    public native boolean isArray();

    public native String getName();

    public java.io.InputStream getResourceAsStream(String name) {
        try {
            if (name.length() > 0 && name.charAt(0) == '/') {
                name = name.substring(1);
            } else {
                String className = this.getName();
                int dotIndex = className.lastIndexOf('.');
                if (dotIndex >= 0) {
                    name = className.substring(0, dotIndex + 1).replace('.',
                            '/')
                           + name;
                }
            }
            return new ResourceInputStream(name);
        } catch (java.io.IOException x) {
            return null;
        }
    }

    private static void runCustomCode() {}

    private native Class getSuperclass();

    private transient Object vmClass;
    private int status;
    private Thread thread;
    private static final int VERIFIED = 1;
    private static final int IN_PROGRESS = 2;
    private static final int INITIALIZED = 3;
    private static final int ERROR = 4;
    private native void invoke_clinit();

    private native void invoke_verifier();

    void initialize() throws Throwable {
        verify();
        synchronized (this) {
            while (status == IN_PROGRESS &&
                   thread != Thread.currentThread()) {
                try {
                    wait();
                } catch (InterruptedException e) {}
            }
            if (status == IN_PROGRESS &&
                thread == Thread.currentThread()) {
                return;
            }
            if (status == INITIALIZED) {
                return;
            }
            if (status == ERROR) {
                throw new Error("NoClassDefFoundError:" + getName());
            }
            status = IN_PROGRESS;
            thread = Thread.currentThread();
        }

        try {

            Class s = getSuperclass();
            if (s != null && s.status != INITIALIZED) {
                s.initialize();
            }
            invoke_clinit();
            synchronized (this) {
                status = INITIALIZED;
                thread = null;
                notifyAll();
            }
        } catch (Throwable e) {

            synchronized (this) {
                status = ERROR;
                thread = null;
                notifyAll();
                throwError(e);
            }
        }
    }

    synchronized void verify() throws Throwable {
        if (status < VERIFIED) {
            getSuperclass().verify();
            invoke_verifier();
            status = VERIFIED;
        }
    }

    private Error throwError(Throwable e) throws Error {
        throw (e instanceof Error) ? (Error) e :
                new Error("Static initializer: "
                          + e.getClass().getName()
                          + ", " + e.getMessage());
    }
}

-------------------------------------------

  1. 为什么private Class()呢?因为class是需要编译好的class文件。当然,现在有技术将代码编译成class文件。
  2. forName():从.class文件装载并创建Class。
  3. Class是object的结构信息呀。但J2ME的能力有限,你不能获取该class有多少个字段,多少个方法。
  4. 注 意:j2me里面没有ClassLoader。但是,通过另外方式来处理ClassLoader了,从上面可以看出,每次Class装载需要两 部:init和verify。class装载的顺序呢,当然首先是系统,然后就是用户的了。由于JVM每次只跑一个MIDlet,所以并没有复杂的依赖关 系了。