abstractasmconstbuilder.java

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

JAVA
229
字号
/**
 * $Id: AbstractAsmConstBuilder.java,v 1.4 2004/02/19 20:22:36 epr Exp $
 */
package org.jnode.build;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import org.jnode.vm.Vm;
import org.jnode.vm.VmArchitecture;
import org.jnode.vm.VmSystemClassLoader;
import org.jnode.vm.classmgr.VmField;
import org.jnode.vm.classmgr.VmInstanceField;
import org.jnode.vm.classmgr.VmNormalClass;
import org.jnode.vm.classmgr.VmType;

/**
 * <description>
 * 
 * @author epr
 */
public abstract class AbstractAsmConstBuilder {

	private File destFile;
	private URL classesURL;
	private ArrayList classes = new ArrayList();

	/**
	 * Execute this task
	 * 
	 * @throws BuildException
	 */
	public void execute() throws BuildException {
		try {
			doExecute();
		} catch (Throwable ex) {
			ex.printStackTrace();
			throw new BuildException(ex);
		}
	}

	/**
	 * Execute this task
	 * 
	 * @throws BuildException
	 * @throws ClassNotFoundException
	 * @throws IllegalAccessException
	 * @throws IOException
	 */
	private void doExecute() throws BuildException, ClassNotFoundException, IllegalAccessException, IOException {

		final VmArchitecture arch = getArchitecture();
		final int slotSize = arch.getReferenceSize();
		VmSystemClassLoader cl = new VmSystemClassLoader(classesURL, arch);
		final Vm vm = new Vm("?", arch, null, cl.getStatics(), false);
		vm.toString(); // Just to avoid compiler warnings
		VmType.initializeForBootImage(cl);
		long lastModified = 0;

		FileWriter fw = new FileWriter(destFile);
		PrintWriter out = new PrintWriter(fw);
		out.println("; " + destFile.getPath());
		out.println("; THIS file has been generated automatically on " + new Date());
		out.println();

		for (Iterator j = classes.iterator(); j.hasNext();) {
			final ClassName cn = (ClassName) j.next();
			final URL classUrl = cn.getURL(classesURL);
			lastModified = Math.max(lastModified, classUrl.openConnection().getLastModified());
			out.println("; Constants for " + cn.getClassName());

			if (cn.isStatic()) {
				Class cls = Class.forName(cn.getClassName());
				Field fields[] = cls.getDeclaredFields();
				for (int i = 0; i < fields.length; i++) {
					Field f = fields[i];
					if (Modifier.isStatic(f.getModifiers()) && Modifier.isPublic(f.getModifiers())) {
						Object value = f.get(null);
						if (value instanceof Number) {
							String cname = cls.getName();
							int idx = cname.lastIndexOf('.');
							if (idx > 0) {
								cname = cname.substring(idx + 1);
							}
							String name = cname + "_" + f.getName();
							out.println(name + " equ " + value);
						}
					}
				}
				out.println();
			} else {

				out.println("; VmClass: " + cn.getClassName());
				VmType vmClass = cl.loadClass(cn.getClassName(), true);
				vmClass.link();
				String cname = vmClass.getName().replace('/', '.');
				int idx = cname.lastIndexOf('.');
				if (idx > 0) {
					cname = cname.substring(idx + 1);
				}
				int cnt = vmClass.getNoDeclaredFields();
				for (int i = 0; i < cnt; i++) {
					final VmField f = vmClass.getDeclaredField(i);
					if (!f.isStatic()) {
						final VmInstanceField instF = (VmInstanceField) f;
						String name = cname + "_" + f.getName().toUpperCase() + "_OFFSET";
						out.println(name + " equ " + (instF.getOffset() / slotSize));
					}
				}
				// The size
				if (vmClass instanceof VmNormalClass) {
					final VmNormalClass cls = (VmNormalClass) vmClass;
					out.println(cname + "_SIZE equ " + cls.getObjectSize());
				}
				//
				out.println();
			}
		}

		out.flush();
		fw.flush();
		out.close();
		fw.close();
		destFile.setLastModified(lastModified);
	}

	public void addClass(ClassName cn) {
		classes.add(cn);
	}

	/**
	 * Returns the destFile.
	 * 
	 * @return File
	 */
	public File getDestFile() {
		return destFile;
	}

	/**
	 * Sets the destFile.
	 * 
	 * @param destFile
	 *            The destFile to set
	 */
	public void setDestFile(File destFile) {
		this.destFile = destFile;
	}

	public static class ClassName {
		private String className;
		private boolean _static = false;

		public ClassName() {
		}

		/**
		 * Returns the className.
		 * 
		 * @return String
		 */
		public String getClassName() {
			return className;
		}

		/**
		 * Sets the className.
		 * 
		 * @param className
		 *            The className to set
		 */
		public void setClassName(String className) {
			this.className = className;
		}
		/**
		 * Returns the _static.
		 * 
		 * @return boolean
		 */
		public boolean isStatic() {
			return _static;
		}

		/**
		 * Sets the _static.
		 * 
		 * @param _static
		 *            The _static to set
		 */
		public void setStatic(boolean _static) {
			this._static = _static;
		}

		public URL getURL(URL root) throws MalformedURLException{
			return new URL(root.toExternalForm() +"/" +className.replace('.', '/') +".class");
		}
	}

	/**
	 * Returns the classesURL.
	 * 
	 * @return URL
	 */
	public URL getClassesURL() {
		return classesURL;
	}

	/**
	 * Sets the classesURL.
	 * 
	 * @param classesURL
	 *            The classesURL to set
	 */
	public void setClassesURL(URL classesURL) {
		this.classesURL = classesURL;
	}
	
	protected abstract VmArchitecture getArchitecture();
}

⌨️ 快捷键说明

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