`

动态编辑加载自定义类

    博客分类:
  • java
 
阅读更多

package test;

import java.io.File; 
import java.lang.reflect.Method; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.util.Arrays; 
 
import javax.tools.JavaCompiler; 
import javax.tools.JavaFileObject; 
import javax.tools.SimpleJavaFileObject; 
import javax.tools.StandardJavaFileManager; 
import javax.tools.ToolProvider; 
import javax.tools.JavaCompiler.CompilationTask; 
import javax.tools.JavaFileObject.Kind; 
 
public class JavaToolsTest { 
    public static void executeMain(String name, String content){ 
        Class<?> claszz = compile(name,content); 
        try { 
            Method method = claszz.getMethod("main", String[].class); 
            System.out.println(method.getName()); 
            method.invoke(null, new Object[] { new String[] {} }); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
    private 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 = ""; 
        try { 
            File classPath = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI()); 
            outDir = classPath.getAbsolutePath() + File.separator; 
        } catch (URISyntaxException e1) { 
            e1.printStackTrace(); 
        } 
        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(); 
            } 
        } 
        return null; 
    } 
    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; 
        } 
    } 
    public static void main(String[] args) throws Exception{ 
        StringBuffer sb = new StringBuffer(); 
        sb.append("package test;"); 
        sb.append("public class Test2{"); 
        sb.append("  public static void main(String[] args){"); 
        sb.append("    System.out.println(\"ok.\");"); 
        sb.append("  }"); 
        sb.append("}"); 
         
        executeMain("test.Test2", sb.toString()); 
    } 

分享到:
评论

相关推荐

    propertyGrid动态加载自定义属性

    本篇将深入探讨如何在C#中使用`PropertyGrid`动态加载自定义属性,以实现更灵活的数据展示和编辑功能。 首先,我们要理解`PropertyGrid`的基本用法。`PropertyGrid`控件通过反射机制自动发现并显示对象的所有公共...

    .net datagridview动态加载自定义模板列

    要实现动态加载自定义模板列,首先我们需要创建一个继承自`DataGridViewTextBoxColumn`或其他基础列类型的类,并重写或扩展其属性和方法。例如,我们可以创建一个名为`DataGridViewCustomTextBoxColumn`的类,其中...

    C# 自定义属性编辑器(UITypeEditor )

    通过自定义UITypeEditor,我们可以为控件、类或其他类型的属性创建定制的编辑界面,使得在设计时能够以更加直观和高效的方式设置属性值。本篇将深入探讨如何利用C#实现自定义属性编辑器,并结合UserControl和...

    loadtree 延迟加载 自定义事件(右键或子节点)

    在这个场景下,我们讨论的是如何在树结构组件中实现`loadtree`的延迟加载,并通过自定义事件处理用户交互,如右键点击或子节点操作。 延迟加载,或称为按需加载,是当用户滚动到特定区域或触发特定操作时才加载数据...

    ASP.net文本编辑自定义控件

    7. **性能优化**:对于大型或复杂的文本编辑控件,开发者需要关注性能,减少不必要的服务器往返,提高页面加载速度。 8. **插件和扩展**:为了增强功能,自定义控件可能需要支持插件机制,允许其他开发者添加额外的...

    vb.net 自定义控件(含自定义对话框设置属性) 实例

    vb.net 自定义控件 自定义属性 UITypeEditor UI 类型编辑器 ...注意一个问题:设计模式与生成dll文件加载显示结果不同,这就是为什么会在设计模式时运行显示灰色,不能跳出自定义对话框,只有在生成文件加载才显示。

    DataGridView添加自定义Columntype

    在自定义的类中,需要实现`IDataGridViewEditingControl`接口中定义的所有方法和属性。这些方法和属性包括但不限于: - `EditingControlDataGridView`: 返回当前正在编辑的DataGridView实例。 - `...

    DLL的动态加载

    DLL动态加载是程序运行时按需加载DLL文件的技术,而非在程序启动时预先加载。这种方式有助于减少内存占用,提高程序启动速度,并允许在运行时更新或替换DLL而无需重新编译主应用程序。在C# WinForm应用中,我们可以...

    动态加载bootstrap表格数据

    10. **自定义扩展**:如果你需要更复杂的功能,如过滤、排序或编辑表格数据,可以考虑使用Bootstrap的扩展库,如Datatables或Handsontable,它们提供了丰富的API和配置选项。 综上所述,动态加载Bootstrap表格数据...

    Android 自定义可编辑下拉框

    在实际项目中,可以根据具体需求进一步扩展,如添加搜索功能,支持动态加载数据等。提供的"Android EditSpinner"文件可能包含了完成这些功能的示例代码,可以作为学习和参考的资源。在研究这些代码时,务必理解其...

    自定义MFC编辑框以及按钮

    在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架中自定义编辑框(Edit Box)和按钮(Button)控件,特别是在加载透明背景资源图片以及实现鼠标交互效果方面。MFC是C++的一个类库,它为...

    自定义eclipse插件

    8. **编辑器和小部件**:Eclipse插件可以创建自定义的文本编辑器或图形化编辑器,如XML编辑器或图形流程设计器。编辑器通常是视图的一部分,用于处理特定类型的文件。 9. **命令和快捷键**:通过定义命令,插件可以...

    安卓富文本编辑器相关-android自定义控件图文编辑框菊花样式Progressbar.zip

    本知识点主要聚焦于如何创建一个图文编辑框以及实现菊花样式(即环形进度条)的自定义Progressbar。下面将详细讲解这两个核心内容。 首先,我们来看富文本编辑框。在Android系统中,标准的EditText控件虽然可以接受...

    Unity3d 动态加载文本数据的方法

    在Unity3D游戏开发中,动态加载文本数据是一项常见的需求,尤其在实现玩家自定义功能、NPC交互等场景中,需要从外部数据文件获取信息。本文主要探讨如何在Unity中有效地读取和处理文本数据。 首先,对于Unity项目中...

    qt自定义标题栏文本编辑器

    QT自定义标题栏文本编辑器是一种利用Qt5框架开发的C++应用程序,它允许开发者对窗口的标题栏进行个性化定制,同时提供基本的文本编辑功能。这个应用的独特之处在于,它可以将文本信息直接存储到图片中,这在某些特定...

    使用kindeditor实现自定义邮件模板,后台根据不同数据动态生成邮件进行发送,前端简单实现demo

    综上所述,本项目结合KindEditor的富文本编辑功能和后台的动态生成、发送邮件能力,实现了自定义邮件模板的功能。这涉及到前端界面设计、HTML和字符串处理、SMTP邮件发送以及安全性和性能优化等多个方面的技术知识。

    jquery ztree自定义编辑的树形菜单插件

    对于大型数据集,ZTree支持异步加载,通过设置`setting.data.async`参数,可以实现在用户展开节点时动态加载子节点,提高页面响应速度。`setting.data.async.url`定义请求数据的URL,`setting.data.async....

    flex 自定义加载进度框

    自定义预加载器可以让开发者自由设计加载界面的外观和交互,例如改变颜色、形状或动画效果,使得加载过程更符合品牌风格或者提升用户体验。 在提供的文件列表中,我们可以看到以下几个文件: 1. `Colorwheel ...

    android自定义控件:图文编辑框,菊花样式Progressbar

    本文将深入探讨如何创建一个图文编辑框以及实现菊花样式(也称 loading 动画)的Progressbar,这两个自定义控件。 首先,我们要理解图文编辑框的概念。在Android中,一个图文编辑框通常指的是可以同时展示文本和...

    自定义编辑框,编辑框中的位图的显示

    在本主题中,我们将深入探讨如何实现一个自定义编辑框,特别是在编辑框中显示位图的功能。这通常涉及到Windows API编程,特别是MFC(Microsoft Foundation Classes)库或者Qt等跨平台框架的使用。下面我们将详细解析...

Global site tag (gtag.js) - Google Analytics