`
hw_alex
  • 浏览: 88417 次
社区版块
存档分类
最新评论

Zk java代码生成器

    博客分类:
  • ZK
阅读更多
比如你有一个index.zul页面,代码如下:
<window id="hello" use="com.yourcompany.example.Hello">
  <button id="hellowWorldButton" onClick="hellow.hellowWorldButtonOnClickHandler()"/>
</window>




给这个主程序类传5个参数,就可以得到最终的java文件。
java生成器代码:
package com.yourcompany.applications;
import com.yourcompany.generators.ZKWindowFileGenerator;
public class ZKWindowFileGeneratorMain {

	/**
	 * Method : main
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		if (args.length != 5) {
	System.out.println("Usage: java ZKWindowFileGeneratorMain inputFileDir inputFileName outputFileDir outputFileName packageName");
			System.exit(0);
		}

		String inputFileDir = args[0]; //输入路径
		String inputFileName = args[1];//输入.zul文件名
		String outputFileDir = args[2];//输出路径
		String outputFileName = args[3]; //输出.java文件名
		String packageName = args[4];  //java文件包名

		ZKWindowFileGenerator generator = null;
		generator = new ZKWindowFileGenerator(inputFileDir, inputFileName, outputFileDir, outputFileName, packageName);

		try {
			generator.generate();
		} catch (Exception e) {
			// Already printed out and logged in the DHgZKWindowFileGenerator
			// class.
		}
	}
}



package com.yourcompany.generators;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ZKCodeGenerator
{
	private String nl = "\n";
	
	
	/**
	 * 
	 * Method : generateMethodComment 
	 * @param methodName
	 * @param description
	 * @param params
	 * @param hasReturnType
	 * @return
	 */
	protected String generateMethodComment(String methodName,
										   String description,
										   String params[],
										   boolean hasReturnType)
	{
		StringBuffer comment = new StringBuffer();
		
		comment.append("    /**" + nl);
        comment.append("     * Method : " + methodName + nl );
        if (description.length() > 70)
        {
        	String commentString = description;
        	while (commentString.length() > 0)
        	{
        		// Grab the first 50 characters
        		int length = commentString.length();
        		int endIndex  = 69;
        		if (length < 69)
        			endIndex = length;
        		String stringToPrint = commentString.substring(0,endIndex);         		
        		comment.append("     *    " + stringToPrint + nl);    
        		// Remove the part that we just used.
        		
        		commentString = commentString.substring(endIndex);        		
        	}
        }
        else
        	comment.append("     *    " + description + nl);
        
        if (params != null)
        {
        	for (int i=0;i<params.length;i++)
        	{
        		String param = params[i];
        		comment.append("     * @param " + param + nl);
        	}
        }
        
        if (hasReturnType)
        {
        	comment.append("     * @return " + nl);        	
        }
        comment.append("     */" + nl);        		
		return comment.toString();
	}
	
	
	
	/**
	 * 
	 * Method : readHeaderCommentsFromFile 
	 * @param fileName - this should include full path information to the file. Ex. /home/root/headers/headerFile.txt
	 * @return
	 * @throws IOException
	 */
	protected String readHeaderCommentsFromFile(String fileName) throws IOException
	{
		BufferedReader in = new BufferedReader(new FileReader(fileName));
		StringBuffer header = new StringBuffer();		
		String currentLine;
		while ((currentLine = in.readLine()) != null)
		{
			header.append(currentLine + "\n");
		}
		in.close();
		return header.toString();
	}

	
	
	/**
	 * 
	 * Method : getHeaderComments 
	 * @param project
	 * @param fileName
	 * @param packageName
	 * @param className
	 * @param author
	 * @param locationOfUse
	 * @param type
	 * @param description
	 * @return
	 */
	protected String getHeaderComments(String project,
									   String fileName,
									   String packageName,
									   String className,
									   String author,
									   String locationOfUse,
									   String type,
									   String description)
	{
		String nl = new String("\n");
		StringBuffer buff = new StringBuffer();
		
		buff.append("/**" + nl); 
		buff.append("* _YourCompany_ Copyright 2007. All Rights Reserved." + nl); 
		buff.append("* " + nl); 
		buff.append("* Project     : " + project + nl); 
		buff.append("* Filename    : " + fileName + nl); 
		buff.append("* Package     : " + packageName + nl); 
		buff.append("* Class       : " + className + nl); 
		buff.append("* Create Date : " + nl); 
		buff.append("* Author      :  " + author + nl); 
		buff.append("*" + nl); 
		buff.append("* Location of Use :  " + locationOfUse + nl); 
		buff.append("*" + nl); 
		buff.append("* Type : " + type + nl); 
		buff.append("* " + nl); 
		buff.append("* Description: " + description + nl); 
		buff.append("*  " + nl); 
		buff.append("*/" + nl); 
		
		return buff.toString();
	}	
	
	/**
	 * 
	 * Method : getHeaderComments 
	 * @return
	 */
	protected String getHeaderComments()
	{
		String nl = new String("\n");
		StringBuffer buff = new StringBuffer();

		buff.append("/**" + nl);
		buff
				.append("* _YourCompany_ Copyright 2007. All Rights Reserved."
						+ nl);
		buff.append("* " + nl);
		buff.append("* Project     : " +  nl);
		buff.append("* Filename    : " +  nl);
		buff.append("* Package     : " +  nl);
		buff.append("* Class       : " +  nl);
		buff.append("* Create Date : " + nl);
		buff.append("* Author      :  " +  nl);
		buff.append("*" + nl);
		buff.append("* Location of Use :  " +  nl);
		buff.append("*" + nl);
		buff.append("* Type : " +  nl);
		buff.append("* " + nl);
		buff.append("* Description: TODO" +  nl);
		buff.append("*  " + nl);
		buff.append("*/" + nl);

		return buff.toString();
	}		
	
	
}



/**
 * Description: 
 * 
 *  This class will take in a ZK .zul file and from that file generate the class that 
 *  extends the zk Window class. It will generate the member variables, the widget lookups in the
 *  onCreate method, and all callback methods that are defined in the .zul file. This will save alot
 *  of time dealing with the very tedious part of creating .zul files and the corresponding java file.
 * 
 */
package com.yourcompany.generators;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ZKWindowFileGenerator extends ZKCodeGenerator {
	private static Logger logger = Logger.getLogger(ZKWindowFileGenerator.class);

	private String className = null;

	private String zkFileName = null;

	private String zkFileDirectory = null;

	private String outputFilePackage = null;

	private String outputFileName = null;

	private String outputDirectory = null;

	private FileWriter writer = null;

	private Vector components = new Vector();

	/**
	 * Constructor
	 * 
	 * @param zkFileName
	 */
	public ZKWindowFileGenerator(String zkFileDirectory, String zkFileName, String outputDirectory,
			String outputFileName, String outputFilePackage) {
		super();
		this.zkFileName = zkFileName;
		this.zkFileDirectory = zkFileDirectory;
		this.outputFileName = outputFileName;
		this.outputDirectory = outputDirectory;
		this.outputFilePackage = outputFilePackage;

	}

	public void generate() throws Exception {
		parseInputFile();
		generateOutputFile();
	}

	/**
	 * Method : parseInputFile
	 * 
	 */
	private void parseInputFile() throws Exception {
		String fileName = null;
		fileName = zkFileDirectory + zkFileName;

		SAXBuilder builder = new SAXBuilder();

		try {
			Document doc = builder.build(fileName);
			Element root = doc.getRootElement();
			this.processDocument(root, 0);

		}
		// indicates a well-formedness error
		catch (JDOMException e) {
			System.out.println(fileName + " is not well-formed.");
			System.out.println(e.getMessage());
		} catch (IOException e) {
			System.out.println(e);
		}

	}

	/**
	 * Method: processDocument Processes the the zul file as DOM tree to get the
	 * components with theire id's and callBackMethod
	 * 
	 * @param current
	 *            node
	 * @param depth
	 *            Used to go deeper in DOM tree (recursive)
	 */
	public void processDocument(Element current, int depth) {

		// if component has no id then ignore it
	if (current.getAttributeValue("id") != null) {
			String idString = current.getAttributeValue("id");
			String componentName = current.getName();
			String callbackMethod = "";		

			// Get callBackMethod if there is any

		if (componentName.equals("button")) {
		if (current.getAttributeValue("onClick") != null) {
	String callBackString = current.getAttributeValue("onClick");
	int indexOfDotInCallBack = callBackString.indexOf(".");
callbackMethod = callBackString.substring(indexOfDotInCallBack + 1);
				}

			}
		if (componentName.equals("listbox")) {
		if (current.getAttributeValue("onSelect") != null) {
		String callBackString = current.getAttributeValue("onSelect");
		int indexOfDotInCallBack = callBackString.indexOf(".");
		callbackMethod = callBackString.substring(indexOfDotInCallBack + 1);
				}

			}
		if (componentName.equals("checkbox") || componentName.equals("radiogroup")) {
		if (current.getAttributeValue("onCheck") != null) {
		String callBackString = current.getAttributeValue("onCheck");
		int indexOfDotInCallBack = callBackString.indexOf(".");
		callbackMethod = callBackString.substring(indexOfDotInCallBack + 1);
			}
		}

			ZKComponentHolder componentHolder = new ZKComponentHolder(componentName, idString, callbackMethod);
			components.add(componentHolder);
		}

		List children = current.getChildren();
		Iterator iterator = children.iterator();
		while (iterator.hasNext()) {
			Element child = (Element) iterator.next();

			processDocument(child, depth + 1);

		}

	}

	/**
	 * 
	 * Method : generateOutputFile
	 */
	private void generateOutputFile() throws Exception {
		setClassName();
		String fileName = outputDirectory + outputFileName;
		writer = new FileWriter(fileName);

		writer.write(getHeaderComments() + "\n\n\n");

		writer.write("package " + outputFilePackage + ";\n\n\n");

		writer.write(generateImportStatements() + "\n\n\n");

		writer.write("class " + className + " extends Window\n");
		writer.write("{\n\n");

		generateMemberVariables();
		generateOnCreateMethod();
		generateCallbackMethods();
		generateInitializeComponentsMethod();
		generateInitializeListBoxMethods();

		writer.write("}\n");
		writer.flush();
		writer.close();
	}

	/**
	 * 
	 * Method : setClassName
	 */
	private void setClassName() {
		// int indexOfDot = zkFileName.indexOf(".");
		// Use the name of output (java) file instead of zul file as class name
		int indexOfDot = outputFileName.indexOf(".");
		className = outputFileName.substring(0, indexOfDot);
	}

	/**
	 * 
	 * Method : generateImportStatemens
	 * 
	 * @return
	 */
	private String generateImportStatements() {
		StringBuffer buff = new StringBuffer();
		buff.append("import org.apache.log4j.Logger;\n");
		buff.append("import org.zkoss.zk.ui.Executions;\n");
		buff.append("import org.zkoss.zul.Button;\n");
		buff.append("import org.zkoss.zul.Messagebox;\n");
		buff.append("import org.zkoss.zul.Textbox;\n");
		buff.append("import org.zkoss.zul.Intbox;\n");
		buff.append("import org.zkoss.zul.Window;\n");
		buff.append("import org.zkoss.zul.Listbox;\n");
		buff.append("import org.zkoss.zul.Radiogroup;\n");
		buff.append("import org.zkoss.zul.Checkbox;\n\n");
		return buff.toString();
	}

	/**
	 * 
	 * Method : generateMemberVariables
	 * 
	 * @throws Exception
	 */
	private void generateMemberVariables() throws Exception {
		writer.write("    private static Logger logger = Logger.getLogger(" + className + ".class);\n");

		Iterator it = components.iterator();
		while (it.hasNext()) {
			ZKComponentHolder holder = (ZKComponentHolder) it.next();
			System.out.println("Type = " + holder.type + " Id = " + holder.id + " Callback = " + holder.callbackMethod);
			if (holder.type.compareTo("listbox") == 0) {
				writer.write("    private Listbox " + holder.id + " = null;\n");
			} else if (holder.type.compareTo("textbox") == 0) {
				writer.write("    private Textbox " + holder.id + " = null;\n");
			} else if (holder.type.compareTo("intbox") == 0) {
				writer.write("    private Intbox " + holder.id + " = null;\n");
			} else if (holder.type.compareTo("button") == 0) {
				writer.write("    private Button " + holder.id + " = null;\n");
			} else if (holder.type.compareTo("radiogroup") == 0) {
				writer.write("    private Radiogroup " + holder.id + " = null;\n");
			} else if (holder.type.compareTo("checkbox") == 0) {
				writer.write("    private Checkbox " + holder.id + " = null;\n");
			}
		}
		writer.write("\n\n\n");
	}

	/**
	 * 
	 * Method : generateOnCreateMethod
	 * 
	 * @throws Exception
	 */
	private void generateOnCreateMethod() throws Exception {
		writer.write(generateMethodComment("onCreate", "", null, false));
		writer.write("    public void onCreate()\n");
		writer.write("    {\n");
		writer.write("        initializeComponents();\n");

		Iterator it = components.iterator();
		while (it.hasNext()) {
			ZKComponentHolder holder = (ZKComponentHolder) it.next();

			if (holder.type.compareTo("listbox") == 0) {
				String id = holder.id;
				String firstChar = id.substring(0, 1);
				id = firstChar.toUpperCase() + id.substring(1);
				writer.write("        initialize" + id + "ListBox();\n");
			}

		}

		writer.write("    }\n\n\n\n");
	}

	/**
	 * 
	 * Method : generateInitializeComponentsMethod
	 * 
	 * @throws Exception
	 */
	private void generateInitializeComponentsMethod() throws Exception {
		writer.write(generateMethodComment("initializeComponents", "", null, false));
		writer.write("    public void initializeComponents()\n");
		writer.write("    {\n");
		Iterator it = components.iterator();
		while (it.hasNext()) {
			ZKComponentHolder holder = (ZKComponentHolder) it.next();

			if (holder.type.compareTo("listbox") == 0) {
				writer.write("        " + holder.id + " = (Listbox)this.getFellow(\"" + holder.id + "\");\n");
			} else if (holder.type.compareTo("textbox") == 0) {
				writer.write("        " + holder.id + " = (Textbox)this.getFellow(\"" + holder.id + "\");\n");
			} else if (holder.type.compareTo("intbox") == 0) {
				writer.write("        " + holder.id + " = (Intbox)this.getFellow(\"" + holder.id + "\");\n");
			} else if (holder.type.compareTo("button") == 0) {
				writer.write("        " + holder.id + " = (Button)this.getFellow(\"" + holder.id + "\");\n");
			} else if (holder.type.compareTo("radiogroup") == 0) {
				writer.write("        " + holder.id + " = (Radiogroup)this.getFellow(\"" + holder.id + "\");\n");
			} else if (holder.type.compareTo("checkbox") == 0) {
				writer.write("        " + holder.id + " = (Checkbox)this.getFellow(\"" + holder.id + "\");\n");
			}
		}

		writer.write("    }\n\n\n\n");
	}

	/**
	 * 
	 * Method : generateInitializeListBoxMethods
	 * 
	 * @throws Exception
	 */
	private void generateInitializeListBoxMethods() throws Exception {
		Iterator it = components.iterator();
		while (it.hasNext()) {
			ZKComponentHolder holder = (ZKComponentHolder) it.next();

			if (holder.type.compareTo("listbox") == 0) {
				String id = holder.id;
				String firstChar = id.substring(0, 1);
				id = firstChar.toUpperCase() + id.substring(1);
				writer.write(generateMethodComment("initialize" + id + "ListBox", "", null, false));
				writer.write("    public void initialize" + id + "ListBox()\n");
				writer.write("    {\n");

				writer.write("    }\n\n\n\n");
			}

		}

	}

	/**
	 * 
	 * Method : generateCallbackMethods
	 * 
	 * @throws Exception
	 */
	private void generateCallbackMethods() throws Exception {
		Iterator it = components.iterator();
		while (it.hasNext()) {
			ZKComponentHolder holder = (ZKComponentHolder) it.next();
			if (holder.callbackMethod.length() > 0) {
				writer.write(generateMethodComment(holder.callbackMethod, "", null, false));
				writer.write("    public void " + holder.callbackMethod + "\n");
				writer.write("    {\n\n");
				writer.write("    }\n\n");
			}
		}
	}

	/**
	 * Embedded class for holding component info
	 */
	protected class ZKComponentHolder {
		public String type;

		public String id;

		public String callbackMethod;

		/**
		 * Constructor
		 * 
		 * @param type
		 * @param id
		 * @param callbackMethod
		 */
		public ZKComponentHolder(String type, String id, String callbackMethod) {
			super();
			this.type = type;
			this.id = id;
			this.callbackMethod = callbackMethod;
		}

	}

	/**
	 * Getter for outputFileName
	 * 
	 * @return Returns the outputFileName.
	 */
	public String getOutputFileName() {
		return this.outputFileName;
	}

	/**
	 * Setter for outputFileName
	 * 
	 * @param outputFileName
	 *            The outputFileName to set.
	 */
	public void setOutputFileName(String outputFileName) {
		this.outputFileName = outputFileName;
	}

	/**
	 * Getter for writer
	 * 
	 * @return Returns the writer.
	 */
	public FileWriter getWriter() {
		return this.writer;
	}

	/**
	 * Setter for writer
	 * 
	 * @param writer
	 *            The writer to set.
	 */
	public void setWriter(FileWriter writer) {
		this.writer = writer;
	}

}



指定5个参数分别是:
args[0] = "D:/javacreator/zul/example/";
args[1] = "index.zul";
args[2] = "D:/javacreator/java/example/";
args[3] = "Hello.java";
args[4] = "com.yourcompany.example";

最后D:/javacreator/java/example/目录下生成的Hello.java文件代码:
/**
* _YourCompany_ Copyright 2007. All Rights Reserved.
* 
* Project     : 
* Filename    : 
* Package     : 
* Class       : 
* Create Date : 
* Author      :  
*
* Location of Use :  
*
* Type : 
* 
* Description: TODO
*  
*/

package com.yourcompany.example;

import org.apache.log4j.Logger;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zul.Button;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Window;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Checkbox;

class Hello extends Window
{

    private static Logger logger = Logger.getLogger(Hello.class);
    private Button hellowWorldButton = null;

    /**
     * Method : onCreate
     *    
     */
    public void onCreate()
    {
        initializeComponents();
    }


    /**
     * Method : hellowWorldButtonOnClickHandler()
     *    
     */
    public void hellowWorldButtonOnClickHandler()
    {

    }

    /**
     * Method : initializeComponents
     *    
     */
    public void initializeComponents()
    {
      hellowWorldButton = (Button)this.getFellow("hellowWorldButton");
    }
}
分享到:
评论
2 楼 hw_alex 2008-09-22  
呵呵,还是自己写比较快
1 楼 mys123s 2008-09-21  
很长很复杂。。

相关推荐

    zk主题生成器

    ZK主题生成器是一款专为ZK框架设计的工具,旨在帮助开发者轻松创建和定制ZK应用的主题,而无需深入理解复杂的CSS(层叠样式表)语言。ZK是一个流行的Java AJAX框架,它允许开发人员构建富客户端Web应用程序,提供...

    java源码包实例源码JAVA开发源码50个合集.zip

    java源码包实例源码JAVA开发源码50个合集: Ajax框架 ZK.rar Java图书馆管理系统源程序.rar Java图片倒影效果实例源码.rar ...连接postsql数据库的java代码.rar 附加数据库.rar 雷电游戏JAVA版源程序.rar

    基于java的Ajax框架 ZK.zip

    ZK是一款强大的基于Java的Ajax框架,它为开发者提供了构建富互联网应用程序(Rich Internet Applications,简称RIA)的强大工具。ZK的主要特点是无需JavaScript编程,即可实现客户端的交互效果,这使得开发过程更为...

    zk eclips插件

    ZK是一个基于组件的Java Web UI框架,它允许开发者创建富客户端应用程序而无需深入JavaScript或其他前端技术。这款插件将ZK的功能无缝整合到Eclipse和MyEclipse中,提供了诸如代码自动完成、调试、项目模板等强大...

    zk studio eclipse plugin

    8. **代码生成器**:自动生成事件处理方法、数据绑定代码,减少重复工作。 9. **ZK更新检查**:自动检测ZK框架的最新版本,提醒用户更新,保持开发环境的最新状态。 **安装ZK Studio插件步骤:** 1. 打开Eclipse...

    java开源包8

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包10

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    ZK 5.0.2 API

    7. **ZK Composer**:ZK提供的设计工具,允许开发者通过图形化界面来设计和编辑用户界面,然后自动生成对应的ZUML代码。 8. **Ajax和 Comet 技术**:ZK利用Ajax技术实现页面的部分刷新,提高用户体验。同时,它还...

    指纹采集器_SDK开发示例程序_C#_Java_VC.zip

    中控ZK4500指纹采集器的SDK包含了所有必要的组件,使得开发者能够在C#、Java和VC++环境中实现指纹采集、识别和比对等功能。 2. **C#示例程序** C#是一种面向对象的编程语言,以其简洁、类型安全的特性深受开发者...

    zk 安装框架

    - **NetBeans with REM**:REM是ZK为NetBeans提供的集成工具,同样支持项目模板、代码生成等特性,使开发过程更加顺畅。 - **手动设置**:对于不习惯使用IDE的开发者,ZK也提供了详细的指导,教你如何手动配置环境...

    java开源包4

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包6

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包101

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包9

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    zk框架学习

    ZK加载器用于解析URL请求并生成HTML页面,而ZK异步更新引擎则负责监听和处理客户端的Ajax请求,并实时更新ZK组件的状态。 - **基于组件的GUI设计**:ZK提供了一套丰富的组件库,这些组件类似于HTML标签但更为灵活...

    java开源包5

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    ZK(AJAX开发工具)开发手册

    ### ZK(AJAX开发工具)开发手册 #### 一、引言 ZK作为一款强大的工具被广泛应用于RIA(Rich Internet Applications)Web应用程序的界面开发。与传统的Web应用程序相比,ZK提供了一种更为直观且高效的方式来进行...

    中控门禁pullSdk Java demo

    Java demo会展示如何在代码中实现这些安全措施。 4. **数据处理**:门禁系统会生成大量的数据,如出入记录、设备状态等。Java demo可能会有数据解析、存储和查询的示例,这可能涉及到Java的集合框架、数据库操作...

    java开源包1

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包3

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

Global site tag (gtag.js) - Google Analytics