`
teasp
  • 浏览: 61307 次
  • 性别: 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

分享到:
评论

相关推荐

    利用java反射将json字符串转成对象.zip

    在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON字符串转换为Java对象。 首先,我们需要了解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人...

    Java获取随机字符串

    本文将详细介绍如何在Java中生成随机字符串,并且会结合给定的部分代码示例进行深入分析。 #### 基本原理与方法 Java提供了多种方法来生成随机字符串,主要包括使用`java.util.Random`类和`java.security....

    字符串转日期

    ### 字符串转日期知识点详解 #### 一、概述 在日常开发工作中,我们经常会遇到需要将日期格式的字符串转换为`Date`类型的情况。这种转换对于数据处理、时间比较等操作至关重要。本文将详细介绍如何在Java环境中...

    Java 推荐系统 字符串 余弦相似度 算法

    根据给定的文件信息,本文将详细介绍如何使用Java实现基于字符串的余弦相似度算法,并应用于推荐系统中。 ### 一、引言 在推荐系统领域,为了衡量两个字符串之间的相似性,通常会采用多种算法,其中余弦相似度算法...

    java 字符串中文判断

    在Java编程语言中,处理字符串是非常常见的操作,尤其是在涉及到文本分析和处理的场景。本文将深入探讨如何在Java中进行中文字符的判断和计数,这主要基于Java的Unicode编码特性以及字符集的理解。 首先,我们需要...

    Java中字符串.pdf

    在Java中,字符串是对象,且它们可以是常量或变量。 - `String`类处理的是不可变字符串,这意味着一旦创建,字符串的内容就不能被修改。例如,尝试更改`String`对象的任何操作(如连接、查找、比较)都会返回一个新...

    java字符串类型数字设置千分位分隔

    在Java编程中,处理数字时,我们经常需要将数字格式化为包含千分位分隔符的字符串,以便于人类阅读。例如,一个大数字123456789.012可能需要转化为"123,456,789.012"的形式。这个过程可以通过使用`DecimalFormat`类...

    实验9:Java数组与字符串.doc

    实验结果证明了 Java 中数组和字符串的概念和使用,例如使用 Math 类生成随机数、数组和字符串的概念、String 类和 StringBuffer 类创建字符串对象的区别等。同时,实验还展示了使用 Java 编程语言来实现实际应用中...

    java实现字符串逆序输出

    在Java编程语言中,字符串的逆序输出是一个基础但重要的概念,它经常在各种问题解决中出现,例如数据处理、字符串操作等。本资源聚焦于如何利用Java编写一个程序,该程序接受用户输入的字符串,并返回这个字符串的...

    Java字符串查找和提取异常处理

    当创建`MyException`对象时,可以传递一个字符串参数作为异常消息,这个消息将在异常被抛出时打印出来。 #### 输入函数 该程序提供了三个输入函数:`inPut()`用于接收用户输入的字符串;`inPutChar()`用于接收单个...

    Java根据正则表达式生成字符串—Xeger,automaton

    在本篇文章中,我们将深入探讨如何利用Java中的Xeger和automaton库来根据正则表达式生成随机字符串。 首先,我们要了解什么是正则表达式。正则表达式,也被称为regex,是由字符、特殊符号组成的模式,用于匹配一...

    字符串排序

    在Java中,可以通过多种方式实现字符串排序,包括但不限于使用内置的`Collections.sort()`方法(适用于可变字符序列如`ArrayList&lt;Character&gt;`)、自定义比较器以及编写专门的排序算法等。本案例采用了一种基于递归的...

    Java中如何使用字符串来实例化类以及调用类

    在Java编程语言中,动态地使用字符串来实例化类并调用其方法是一种高级特性,主要依赖于`java.lang.Class`类和`java.lang.reflect`包中的反射机制。这一技术在许多场景下都非常有用,例如在插件架构、动态加载类、...

    java 倒置字符串

    在Java编程语言中,倒置字符串是一个常见的任务,它涉及到将一个给定的字符串的字符顺序反转。在本文中,我们将深入探讨如何在Java中实现这个功能,以及使用哪种数据结构和方法可以最有效地完成这一操作。 首先,让...

    利用java反射调用实现对字符串的解析,成功调入函数,并且返回值

    总的来说,通过Java反射,我们可以动态地调用对象的方法,这在处理不确定或动态行为时非常有用,比如解析字符串、插件系统或者序列化/反序列化等场景。然而,反射也带来了性能开销和安全风险,因此在使用时需要谨慎...

    Java精确截取字符串.doc

    在Java编程中,有时我们需要对字符串进行精确截取,特别是在处理中文字符时,由于中文字符在内存中通常以双字节形式存储,因此简单的按照字符数截取可能会导致汉字被分割,影响显示效果。这个问题在文档标题“Java...

    java统计字符串每个字符出现次数

    在Java编程中,统计字符串中每个...这个程序可以方便地统计任何给定字符串中每个字符的出现次数,包括大小写字母。在实际应用中,可以修改或扩展这个程序以适应其他需求,例如忽略大小写、只统计特定字符集内的字符等。

    练习使用Java基本数据类型。使用Java的String类操作字符串和子串

    Java的`String`类用于表示不可变的字符序列,它包含许多方法用于操作和处理字符串。在实验中,`String`类的`regionMatches()`方法被用来检查一个字符串是否包含在另一个字符串中。 【regionMatches()方法】 `...

    String 字符串操作、比较、查找字符、替换、反转、分割等

    - `split(String regex)`:根据给定的正则表达式将字符串分割成多个子字符串,并返回一个包含这些子字符串的数组。 ### 示例代码 ```java public class TestJavaDemo01 { public static void main(String[] args)...

    比较字符串1

    标题 "比较字符串1" 描述的是一个算法训练问题,旨在比较两个字符串的字典序,并在它们不相等时找出第一个不同的字符。这个问题涉及到的主要知识点包括字符串操作、字典序比较以及基本的ASCII码理解。 首先,我们...

Global site tag (gtag.js) - Google Analytics