`
teasp
  • 浏览: 59378 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java如何将给定的字符串转成Class对象

阅读更多

给定一个定义类的字符串,比如“package com.teasp.compile; public class Test{ public static void main(String[] args){System.out.println(\"compile test.\");} }”,怎么将其转换成Class对象呢?下面的代码可以实现该功能:

/**
 * Java6及以上才可用。
 * 如果ToolProvider.getSystemJavaCompiler();返回的是null,说明jre的lib里面
 * 没有tools.jar,要将jdk的lib中的tools.jar复制到jre的lib中。
 * 设计作者: teasp
 * 信息描述:
 */
public class CompileTest
{
    public final static Class<?> compile(String name, String content)
    {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
        StrSrcJavaObject srcObject = new StrSrcJavaObject(name, content);
        Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(srcObject);
        String flag = "-d";
        String outDir = System.getProperty("user.dir") + "/bin";
        Iterable<String> options = Arrays.asList(flag, outDir);
        CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);
        boolean result = task.call();
        if (result == true)
        {
            System.out.println("Compile it successfully.");
            try
            {
                return Class.forName(name);
            }
            catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
            /*ClassLoader loader = CompileTest.class.getClassLoader();
            Class<?> cls;
            try
            {
                cls = loader.loadClass(name);
                return cls;
            }
            catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }*/
        }
        
        return null;
    }
    
    public static void main(String[] args)
    {
        Class<?> cls = compile("com.teasp.compile.Test",
        		"package com.teasp.compile; public class Test{ public static void main(String[] args){System.out.println(\"compile test.\");} }");
        System.out.println(cls.getCanonicalName());
        try
        {
            Method method = cls.getMethod("main", String[].class);
            System.out.println(method.getName());
            method.invoke(null, new Object[]{new String[]{}});
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private static class StrSrcJavaObject extends SimpleJavaFileObject
    {
        private String content;
        
        public StrSrcJavaObject(String name, String content)
        {
            super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
            this.content = content;
        }
        
        public CharSequence getCharContent(boolean ignoreEncodingErrors)
        {
            return content;
        }
    }
}

 参考:http://www.infoq.com/cn/articles/cf-java-byte-code

分享到:
评论

相关推荐

    2Java SE(上).doc

    2)int indexOf(String str):查看给定字符串在当前字符串中的位置。 首先该方法会使用给定的字符串与当前字符串进行全匹配,当找到位置后,会将给 定字符串中第一个字符在当前字符串中的位置返回。常用来查找...

    Java实现 LeetCode 541 反转字符串 II(暴力大法)

    541. 反转字符串 II 给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 ...给定字符串的长度和 k 在[1, 10000]范围内。 PS: 暴力 欢迎评论 class Solution { public static void swap(char [] a,int begin

    Java实现 LeetCode 567 字符串的排列(滑动窗口,处理区间内的字符数量)

    给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。 换句话说,第一个字符串的排列之一是第二个字符串的子串。 示例1: 输入: s1 = “ab” s2 = “eidbaooo” 输出: True 解释: s2 包含 s1 的排列之...

    leetcode131. 分割回文串

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: “aab” 输出: [  [“aa”,”b”],  [“a”,”a”,”b”] ] 思路:搜索回溯,搜索过程中检查是否是...

    消除字符串重复字母(栈实现)

    题目意思是给一个字符串aabbbassa,消除掉超过两次连续的字母,直到不能消除。 package 快手笔试; import java.util.Scanner; import java.util.Stack; public class Solution1 { public static void main(String...

    java面向对象程序设计习题-(11).doc

    方法包括:获得学号,获得班号,获得姓名,获得性别,获得年龄,获得班 级总人数,修改学号,修改班号,修改姓名,修改性别,修改年龄以及一个toString() 方法将Student类中的所有属性组合成一个字符串。定义一个...

    Java实现 LeetCode 680 验证回文字符串 Ⅱ(暴力)

    给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。 示例 1: 输入: “aba” 输出: True 示例 2: 输入: “abca” 输出: True 解释: 你可以删除c字符。 注意: 字符串只包含从 a-z 的小写字母。字符...

    Java实现 LeetCode 686 重复叠加字符串匹配

    给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。 举个例子,A = “abcd”,B = “cdabcdab”。 答案为 3, 因为 A 重复叠加三遍后为 “abcd...

    Java实现 LeetCode 792 自定义字符串排序(暴力)

    给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数。 示例: 输入: S = “abcde” words = [“a”, “bb”, “acd”, “ace”] 输出: 3 解释: 有三个是 S 的子序列的单词: “a”, “acd”, ...

    词法程序设计——DFA模拟程序

    ③循环②步直到B状态为终态时停止则该字符串符合该文法或a指向最后一个字符时都没到终态停止则该字符窜不符合该文法。 2.3 实验流程 ①预习实验,实验前阅读实验指导书和阅读书本。 ②通过书本了解判断文法的原理...

    JAVA面试题最全集

    编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet...

    java常用工具类的使用

    在程序设计时,界面上用户输入的基本上都是字符串,如果字符串输入一个出生年月,如何把该字符串转换成Date类型呢?可以使用SimpleDateFormat的parse()方法。 代码演示:SimpleDateFormat解析日期 import java.text...

    Java实现 LeetCode 522 最长特殊序列 II(查找最长的非子序列的长度)

    522. 最长特殊序列 II 给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列...给定字符串列表的长度将在 [2, 50 ] 之间。 PS; 查找最长的非子序列问题 class

    java万能DAO

    * 将给定字符串首字母修改为小写 * @param str 字符串 * @return 转换后的字符串 */ private String firstUpper(String str){ return (str.charAt(0)+"").toUpperCase()+str.substring(1); } /** * 设置...

    使用JDBC访问数据库 (自动保存的).doc

    //加载数据库引擎,返回给定字符串名的类 }catch(ClassNotFoundException e) { //e.printStackTrace(); System.out.println("加载数据库引擎失败"); System.exit(0); } System.out.println("数据库驱动成功...

    C++数据结构与算法之哈夫曼树的实现方法

    前面一篇图文详解JAVA实现哈夫曼树对哈夫曼树的原理与java实现方法做了较为详尽的描述,这里再来看看C++实现方法。 具体代码如下: #include using namespace std; #if !defined(_HUFFMANTREE_H_) #define _...

    json2Gson:使用Python脚本将JSON输入转换为Java类以与GSON Java库一起使用

    虽然将编译结果,并且外观将达到您的期望,但是此脚本有些无法为您完成的事情(例如,使用枚举而不是字符串..)。 一定要查看输出内容:) 用法 usage: json2Gson.py [-h] [--class_name NAME] Convert a sample ...

    LeetCode判断字符串是否循环-LeeCode-Java:记录Leecode刷题思路与知识点

    LeetCode判断字符串是否循环 LeeCode- Java 记录Leecode刷题思路与知识点 题目分类 Hash相关 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的...

    Java文件处理工具类--FileUtil

    * 读取文件并返回为给定字符集的字符串. * @param fileName * @param encoding * @return * @throws Exception */ public static String readFileAsString(String fileName, String encoding) throws ...

    JavaScript笔记

    |--x.toString():用于把一个 Number 对象转换为一个字符串,并返回结果 19.正则表达式对象:(专门用于查找和验证) reg.test(‘要验证的完整字符串’)匹配返回true,否则返回false 强调:如果正则表达式使用了^和$...

Global site tag (gtag.js) - Google Analytics