文档章节

指定包名下所有Enum生成json.js文件

田Instance
 田Instance
发布于 2013/09/10 15:08
字数 587
阅读 124
收藏 0
import org.apache.log4j.Logger;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.core.io.VfsResource;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;


public final class BuildEnumJsonFileUtils {

    static final Logger LOGGER = Logger.getLogger(BuildEnumJsonFileUtils.class);

    public BuildEnumJsonFileUtils(String packageName) throws IOException, ClassNotFoundException {
        this.packageName = packageName;
        this.path = packageName.replace('.', '/');
        this.classList = getClassesByPackageName();


    }

    private String packageName;

    private List<String> classList;

    private String path;

    /**
     * 通过(包名/命名空间)获得所有类
     *
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public List<String> getClassesByPackageName() throws IOException, ClassNotFoundException {
        List<String> classList = new ArrayList<String>();
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        URL url = classLoader.getResource(path);
        String protocol = url.getProtocol();
        LOGGER.error("URL-FILE : " + url.getFile() + "*********************************************************");
        LOGGER.error("path : " + this.path + "*********************************************************");
        LOGGER.error("protocol : " + protocol + "*********************************************************");
        if (protocol.equals("file")) {
            File fileDirectory = new File(url.getFile());
            classList = findClasses(fileDirectory);
        } else if (protocol.equals("jar") || protocol.equals("vfszip")) {  //vfszip 兼容jboss
            JarFile jarFile = ((JarURLConnection) url.openConnection())
                    .getJarFile();
            classList = findClasses(jarFile);
        } else if (protocol.equals("vfszip")) {
            VfsResource v = new VfsResource(url.getContent());
            File fileDirectory = v.getFile();
            classList = findClasses(fileDirectory);
        }
        return classList;

    }

    /**
     * 通过文件夹所有类文件名
     *
     * @param directory 文件夹名称
     * @return
     * @throws ClassNotFoundException
     */
    public List<String> findClasses(File directory) throws ClassNotFoundException {
        List<String> classes = new ArrayList<String>();
        if (!directory.exists())
            return classes;
        File[] files = directory.listFiles();
        for (File file : files) {
            if (!file.getName().endsWith(".class")) continue;
            String clazzName = file.getName().replaceAll(".class", "");
            classes.add(packageName + "." + clazzName);
        }
        return classes;
    }

    public List<String> findClasses(JarFile jarFile) throws ClassNotFoundException {
        List<String> classes = new ArrayList<String>();
        Enumeration<JarEntry> entries = jarFile.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            if (!(entry.getName().startsWith(path) && entry.getName().endsWith(".class"))) continue;
            // 将其变成全定限完整类名
            String clazzName = entry.getName().replaceAll(".class", "").replace("/", ".");
            classes.add(clazzName);
        }
        return classes;
    }


    /**
     * 构建枚举Json
     *
     * @param jsonFile 需要写入的json文件
     * @throws IOException
     * @throws ClassNotFoundException
     * @throws NoSuchMethodException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    public void buildEnumJson(File jsonFile) {
        JsonGenerator jsonGenerator = null;
        Writer writer = null;
        try {
            writer = new OutputStreamWriter(new FileOutputStream(jsonFile), "UTF-8");
            addJsonEnumsHead(writer);
            jsonGenerator = new ObjectMapper().getJsonFactory().createJsonGenerator(writer);
            jsonGenerator.writeStartObject();
            this.buildJsonList(jsonGenerator);
            jsonGenerator.writeEndObject();
            // 先输出json
            jsonGenerator.flush();
            addJsonEnumsBottom(writer);
            jsonGenerator.close();
            writer.close();
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } finally {
            jsonGenerator = null;
            writer = null;
        }
    }

    /**
     * 构建Json列表
     *
     * @param jsonGenerator json生成器
     * @throws ClassNotFoundException
     * @throws NoSuchMethodException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws IOException
     * @throws JsonGenerationException
     * @throws JsonProcessingException
     */
    private void buildJsonList(JsonGenerator jsonGenerator)
            throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException,
            IOException, JsonGenerationException, JsonProcessingException {
        if (classList.size() == 0) return;
        String className = classList.get(0);
        Class<?> enumz = Class.forName(className);
        jsonGenerator.writeFieldName(enumz.getSimpleName());
        Map<String, Map<String, String>> enumMap = getEnumElementMap(enumz);
        jsonGenerator.writeObject(enumMap);
        classList.remove(0);
        buildJsonList(jsonGenerator);
    }

    /**
     * 获得枚举类元素Map
     *
     * @param enumz 枚举类Class
     * @return
     * @throws NoSuchMethodException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    private Map<String, Map<String, String>> getEnumElementMap(Class<?> enumz) throws NoSuchMethodException,
            IllegalAccessException, InvocationTargetException {
        Map<String, Map<String, String>> enumMap = new LinkedHashMap<String, Map<String, String>>();
        Method values = enumz.getMethod("values");
        Method getTitleMethod = enumz.getMethod("getTitle");
        Method getValueMethod = enumz.getMethod("getValue");
        Object returnElement = values.invoke(enumz);
        for (Object element : (Object[]) returnElement) {
            Map<String, String> tempMap = new LinkedHashMap<String, String>();
            String title = (String) getTitleMethod.invoke(element);
            tempMap.put("title", title);
            String value = (String) getValueMethod.invoke(element);
            tempMap.put("value", value);
            enumMap.put(element.toString(), tempMap);
        }
        return enumMap;
    }


    private void addJsonEnumsHead(Writer writer) throws IOException {
        writer.write("var enumJson = ");
    }

    private void addJsonEnumsBottom(Writer writer) throws IOException {
        writer.append(";");
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        BuildEnumJsonFileUtils buildJson = new BuildEnumJsonFileUtils("com.zskx.ipem.enums");
        String jsonPath = "usefullJson.js";
        File jsonFile = new File(jsonPath);
        buildJson.buildEnumJson(jsonFile);
    }

}

© 著作权归作者所有

田Instance
粉丝 20
博文 5
码字总数 3214
作品 0
海淀
程序员
私信 提问
从0开始写JavaWeb框架系列(2)从0开始写SamrtFrameWork:开发一个类加载器

一、开发一个类加载器来加载基础包名下的所有类,如使用了某注解的类,或者实现了某接口的类,又或者继承了某父类的所有子类(编写一个工具类,四个注解类) 1.1、需要写一个ClassUtil工具类,...

AAASSSSddd
2016/05/27
55
0
Android组件化开发实践(八):组件生命周期如何实现自动注册管理

1. 前言 前面有一章讲过组件生命周期管理,参见Android组件化开发实践(五):组件生命周期管理。之前只是为了讲解组件生命周期的概念,以及这样做的原因,但是这样实施过程中,会发现在壳工...

云之崖
2018/10/25
0
0
Android 第三课——项目结构及作用

● src—包含项目的.java源文件。 在本例中, 有一个文件:HelloWorldActivity.java。HelloWorld Activity.java文件是活动的源文件,您将在这个文件中编写应用程序的代码。这个Java文件在项目...

learn_more
2014/12/30
0
0
java枚举的用法

转载:点击打开链接 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。 下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容: 1. 原始的接口定义...

lwang_IT
2017/12/25
0
0
protobuf 语法浅析

Protobuf 为什么用Protobuf Buffer 跨语言平台编程,使用SOAP的话,该方式是使用xml的方式传输,会大大增加网络的IO,而且xml的解析复杂,降低报文的解析性能。 定义一个Protobuf消息 关键说...

hgfgoodcreate
2016/07/16
210
0

没有更多内容

加载失败,请刷新页面

加载更多

Oracle:本地表空间管理,字典表空间管理

本地管理表空间 一、概述 1、理解本地管理表空间的由来 2、理解什么是字典管理表空间及工作原理 3、理解本地管理表空间的优势(为什么要使用本地管理表空间) 4、理解本地管理表空间的内部结...

突突突酱
24分钟前
1
0
深度剖析Spring Boot源码,看完薪资敢要30K!

1 实例化SpringApplication SpringApplication.run(BootifulApplication.class, args); public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {ret......

Java架构资源分享
27分钟前
4
0
tornadofx控制台输出“三门问题”,蒙特卡洛算法

import tornadofx.*fun main() { val wins = intProperty() val lose = intProperty() val Msg = stringProperty()// 1000万次 val n = 10000000 (1..n......

oschina4cyy
33分钟前
1
0
你可能不知道的MySQL中的定点数类型

定点数类型 正因为用浮点数表示小数可能会有不精确的情况,在一些情况下我们必须保证小数是精确的,所以设计MySQL的大叔们提出一种称之为定点数的数据类型,它也是存储小数的一种方式: 其中...

爱编程的浪子
36分钟前
2
0
第十讲:Python爬取网页图片并保存到本地,包含次层页面

上一讲我们讲到了从昵图网的首页下载图片到本地,但是我们发现首页上面的大部分链接其实都可以进入到二级页面。 在二级页面里面,我们也可以同样进行图片的下载,通过层层循环我们可以把网址...

刘日辉
42分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部