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