登录  /  注册
首页 > Java > java教程 > 正文

怎么使用JavaPoet?

怪我咯
发布: 2017-06-23 14:09:12
原创
2280人浏览过

一、介绍

  javapoet项目可以动态的生成java文件,这是一个很强大和很动态的方法,使用注解的时候假如需要生成新的java文件就可以通过这个开源项目实现。

二、JavaPoet常用的类

  MethodSpec 代表一个构造函数或方法声明。
     TypeSpec 代表一个类、借口或者枚举声明。
     FieldSpec 代表一个成员变量,一个字段声明。
     JavaFile 包含一个顶级类的Java文件。

三、引入开源项目

  compile 'com.squareup:javapoet:1.8.0'

  也可以在开源项目处找到jar文件,下载下来,引入到项目中。

四、生成一个函数

  生成一个件简单的HelloWorld类,有一个静态方法,只是简单的输出“Hello World”字符串。

package com.zhangmiao;import javax.lang.model.element.Modifier;import com.squareup.javapoet.*;import java.io.File;import java.io.IOException;import java.lang.System;public class MainClass {    /**
     * @param args
     *     */
    public static void main(String[] args) {        // TODO Auto-generated method stub
        MainClass mainClass = new MainClass();
        mainClass.generateHelloWord();
        
    }    
    private void generateHelloWord(){
        MethodSpec main = MethodSpec.methodBuilder("show")
          .addModifiers(Modifier.PUBLIC,Modifier.STATIC)
          .addStatement("$T.out.println($S)",System.class,"Hello World!")
          .build();
        TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")
        .addModifiers(Modifier.PUBLIC)
        .addMethod(main)
        .build();
        
        JavaFile javaFile = JavaFile.builder("com.zhangmiao", helloWorld).build();
        File outputFile = new File("src/"); //输出文件 
        
        try {
            javaFile.writeTo(outputFile);
            javaFile.writeTo(System.out);
        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();
        }
    }
}
登录后复制

  运行结果会显示整个类的内容,运行MainClass之后,选择项目点击右键,运行Refresh之后,就可以在包下看到HelloWorld.java类了。

五、调用HelloWorld类的show方法

package com.zhangmiao;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class test {    /**
     * @param args     */
    public static void main(String[] args) {        // TODO Auto-generated method stub
        try {
            Class hello = Class.forName("com.zhangmiao.HelloWorld");
            hello.newInstance();
            Method method = hello.getMethod("show", null);
            method.invoke(null, null);
        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block
            System.out.println("Class Not Found");
        } catch (InstantiationException e) {            // TODO Auto-generated catch block            e.printStackTrace();
        } catch (IllegalAccessException e) {            // TODO Auto-generated catch block            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            System.out.println("No Such Method");
        } catch (SecurityException e) {            // TODO Auto-generated catch block            e.printStackTrace();
        } catch (IllegalArgumentException e) {            // TODO Auto-generated catch block            e.printStackTrace();
        } catch (InvocationTargetException e) {            // TODO Auto-generated catch block            e.printStackTrace();
        }
    }

}
登录后复制

  运行test之后,可以看到运行show方法的结果,打印"Hello World"字符串。

六、注意事项

我的代码是使用MyEcplise写的,jdk的版本需要是jdk1.7,如果不是1.7,代码运行就会报如下错误:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/squareup/javapoet/MethodSpec : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at MainClass.main(MainClass.java:13)
登录后复制

这个时候就需要将jdk的版本修改为1.7。

还有一些其他生成类和方法的方法,比如for循环的写法,直接使用addCode()方法生成方法内容,设置返回值、参数等等,这些细节可以参考源码地址的README.md文件,很详细,本文只是简单的使用一下。

以上就是怎么使用JavaPoet?的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号