Java动态编译并执行JavaCompiler动态编译并执行java代码片段

Java是动态语言吗?JavaCompiler实现动态编译,并通过反射赋值 小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。我们选择的这个行业就一直要持续的学习,又很吃青春饭。虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。送给每一位想学习Java小伙伴,用来提升自己。 阅读详情

目录

1.创建自定义类加载器

2.创建自定义JAVA文件对象 

3.查找指定包中的所有类 

4.创建class字节码文件对象

5.创建自定义文件管理器

6.创建自定义源文件对象

7.编译方法,准备编译

8.开始编译并执行


1.创建自定义类加载器

public class DynamicClassLoader extends ClassLoader {
    /**
     * 已编译的class字节码
     */
    private final Map<String, ByteJavaFileObject> byteCodes = new HashMap<>();

    public DynamicClassLoader(ClassLoader classLoader) {
        super(classLoader);
    }


    @Override
    protected Class<?> findClass(String name) {
        Class<?> result = null;
        byte[] bytes = null;
        //从内存中获取
        ByteJavaFileObject fileObject = byteCodes.get(name);
        if (fileObject == null) {
            //查找class文件 编译完成后我这会将class文件保存下来,所以这里会查找指定路径的文件。
            File file = new File(String.format(Constants.DYNAMIC_CLASS_PATH, name.replace(".", "/")));
            if (file.exists()) {
                bytes = FileUtil.readBytes(file);
            }
        } else {
            bytes = fileObject.getByteCode();
        }
        if (bytes != null) {
            result = super.defineClass(name, bytes, 0, bytes.length);
        }
        return result;
    }

    public void addCompiledSource(ByteJavaFileObject byteCode) {
        byteCodes.put(byteCode.getClassName(), byteCode);
    }

    public Map<String, Class<?>> getClasses() {
        Map<String, Class<?>> classes = new HashMap<>(byteCodes.size());
        for (ByteJavaFileObject byteCode : byteCodes.values()) {
            classes.put(byteCode.getClassName(), findClass(byteCode.getClassName()));
        }
        return classes;
    }

    public Class<?> getClasses(String className) {
        return findClass(className);
    }

    public Map<String, byte[]> getByteCodes() {
        Map<String, byte[]> result = new HashMap<>(byteCodes.size());
        for (Map.Entry<String, ByteJavaFileObject> entry : byteCodes.entrySet()) {
            result.put(entry.getKey(), entry.getValue().getByteCode());
        }
        return result;
    }
}

2.创建自定义JAVA文件对象 

public class CustomJavaFileObject implements JavaFileObject {
    /**
     * 文件名称
     */
    private final String binaryName;
    /**
     * JAR URI
     */
    private final URI uri;
    
    private final String name;

    public CustomJavaFileObject(String binaryName, URI uri) {
        this.uri = uri;
        this.binaryName = binaryName;
        name = uri.getPath() == null ? uri.getSchemeSpecificPart() : uri.getPath();
    }

    public URI toUri() {
        return uri;
    }

    public InputStream openInputStream() throws IOException {
        return uri.toURL().openStream();
    }

    public OutputStream openOutputStream() {
        throw new UnsupportedOperationException();
    }

    public String getName() {
        return name;
    }

    public Reader openReader(boolean ignoreEncodingErrors) {
        throw new UnsupportedOperationException();
    }

    public CharSequence getCharContent(boolean ignoreEncodingErrors) {
        throw new UnsupportedOperationException();
    }

    public Writer openWriter() throws IOException {
        throw new UnsupportedOperationException();
    }

    public long getLastModified() {
        return 0;
    }

    public boolean delete() {
        throw new UnsupportedOperationException();
    }

    public JavaFileObject.Kind getKind() {
        return JavaFileObject.Kind.CLASS;
    }

    public boolean isNameCompatible(String simpleName, JavaFileObject.Kind kind) {
        String baseName = simpleName + kind.extension;
        return kind.equals(getKind())
            && (baseName.equals(getName())
            || getName().endsWith("/" + baseName));
    }

    public NestingKind getNestingKind() {
        throw new UnsupportedOperationException();
    }

    public Modifier getAccessLevel() {
        throw new UnsupportedOperationException();
    }

    public String binaryName() {
        return binaryName;
    }


    public String toString() {
        return this.getClass().getName() + "[" + this.toUri() + "]";
    }
}

3.查找指定包中的所有类 

public class PackageInternalsFinder {
    /**
     * 自定义类加载器
     */
    private final DynamicClassLoader classLoader;
    /**
     * 文件后缀
     */
    private static final String CLASS_FILE_EXTENSION = ".class";

    public PackageInternalsFinder(DynamicClassLoader classLoader) {
        this.classLoader = classLoader;
    }

    /**
     * 查找指定包下所有的java文件对象
     * @param packageName 包路径
     * @return java文件对象
     * @throws IOException
     */
    public List<JavaFileObject> find(String packageName) throws IOException {
        String javaPackageName = packageName.replaceAll("\\.", "/");

        List<JavaFileObject> result = new ArrayList<>();

        Enumeration<URL> urlEnumeration = classLoader.getResources(javaPackageName);
        while (urlEnumeration.hasMoreElements()) { 
            //类路径上每个jar都有一个URL
            URL packageFolderURL = urlEnumeration.nextElement();
            //获取jar包里面的类
            result.addAll(listUnder(packageName, packageFolderURL));
        }

        return result;
    }

    private Collection<JavaFileObject> listUnder(String packageName, URL packageFolderURL) {
        File directory = new File(decode(packageFolderURL.getFile()));
        //是一个文件夹
        if (directory.isDirectory()) {
            return processDir(packageName, directory);
        } 
        //是一个jar包
        else { 
            return processJar(packageFolderURL);
        }
    }

    /**
     * 获取jar包里面的类
     * @param packageFolderURL jar url
     * @return java文件对象集合
     */
    private List<JavaFileObject> processJar(URL packageFolderURL) {
        List<JavaFileObject> result = new ArrayList<>();
        try {
            String jarUri = packageFolderURL.toExternalForm().substring(0, packageFolderURL.toExternalForm().lastIndexOf("!/"));
            //创建获取jar包资源对象
            JarURLConnection jarConn = (JarURLConnection) packageFolderURL.openConnection();
            //jar包根目录名称
            String rootEntryName = jarConn.getEntryName();
            int rootEnd = rootEntryName.length() + 1;
            //获取jar文件
            Enumeration<JarEntry> entryEnum = jarConn.getJarFile().entries();
            //遍历文件
            while (entryEnum.hasMoreElements()) {
                JarEntry jarEntry = entryEnum.nextElement();
                //资源名称
                String name = jarEntry.getName();
                //当前目录下的class文件
                if (name.startsWith(rootEntryName) && name.indexOf('/', rootEnd) == -1 && name.endsWith(CLASS_FILE_EXTENSION)) {
                    URI uri = URI.create(jarUri + "!/" + name);
                    String binaryName = name.replaceAll("/", ".");
                    binaryName = binaryName.replaceAll(CLASS_FILE_EXTENSION + "$", "");

                    result.add(new CustomJavaFileObject(binaryName, uri));
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("Wasn't able to open " + packageFolderURL + " as a jar file", e);
        }
        return result;
    }

    /**
     * 获取文件夹里面的类
     * @param packageName 包名
     * @param directory 文件夹
     * @return java文件对象集合
     */
    private List<JavaFileObject> processDir(String packageName, File directory) {
        List<JavaFileObject> result = new ArrayList<JavaFileObject>();
        //当前目录的子级
        File[] childFiles = directory.listFiles();
        if (childFiles != null) {
            for (File childFile : childFiles) {
                if (childFile.isFile()) {
                    //是class文件
                    if (childFile.getName().endsWith(CLASS_FILE_EXTENSION)) {
                        String binaryName = packageName + "." + childFile.getName();
                        binaryName = binaryName.replaceAll(CLASS_FILE_EXTENSION + "$", "");

                        result.add(new CustomJavaFileObject(binaryName, childFile.toURI()));
                    }
                }
            }
        }

        return result;
    }

    private String decode(String filePath) {
        try {
            return URLDecoder.decode(filePath, "utf-8");
        } catch (Exception e) {
        }

        return filePath;
    }
}

4.创建class字节码文件对象

public class ByteJavaFileObject extends SimpleJavaFileObject {

    private static final char DIR_SEPARATOR = '/';
    private static final char PKG_SEPARATOR = '.';
    private ByteArrayOutputStream byteArrayOutputStream;

    public ByteJavaFileObject(String className) {
        super(URI.create("byte:///" + className.replace(PKG_SEPARATOR, DIR_SEPARATOR) + Kind.CLASS.extension), Kind.CLASS);
    }

    public String getClassName() {
        String className = getName();
        className = className.replace(DIR_SEPARATOR, PKG_SEPARATOR);
        className = className.substring(1, className.indexOf(Kind.CLASS.extension));
        return className;
    }

    @Override
    public OutputStream openOutputStream() {
        if (byteArrayOutputStream == null) {
            byteArrayOutputStream = new ByteArrayOutputStream();
        }
        return byteArrayOutputStream;
    }

    public byte[] getByteCode() {
        return byteArrayOutputStream.toByteArray();
    }
}

5.创建自定义文件管理器

public class DynamicJavaFileManager extends ForwardingJavaFileManager<JavaFileManager> {
    /**
     * 运行环境中的资源路径
     */
    private static final String[] superLocationNames = {StandardLocation.PLATFORM_CLASS_PATH.name(), "SYSTEM_MODULES"};
    /**
     * 用于查找给定包中的内部类
     */
    private final PackageInternalsFinder finder;

    /**
     * 自定义类加载器
     */
    private final DynamicClassLoader classLoader;

    /**
     * 初始化
     * @param fileManager 文件管理器
     * @param classLoader 类加载器
     */
    public DynamicJavaFileManager(JavaFileManager fileManager, DynamicClassLoader classLoader) {
        super(fileManager);
        this.classLoader = classLoader;

        finder = new PackageInternalsFinder(classLoader);
    }

    /**
     * 获取一个用于输出的java文件对象
     * 当你编译一个Java源文件时,编译器会生成一个或多个输出文件(例如.class文件)
     * 方法用于获取这些输出文件的JavaFileObject,这样编译器就可以将编译的结果写入这些文件
     * @param location a location
     * @param className 类名
     * @param kind 文件类型 
     * {@link JavaFileObject.Kind#SOURCE 源文件后缀}
     * {@link JavaFileObject.Kind#CLASS class文件后缀}
     * @param sibling 保存提示的文件对象
     * @return java文件对象
     */
    @Override
    public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location, String className,
                                               JavaFileObject.Kind kind, FileObject sibling) {
        ByteJavaFileObject byteJavaFileObject = new ByteJavaFileObject(className);
        //保存编译后的class字节码到内存中
        classLoader.addCompiledSource(byteJavaFileObject);
        return byteJavaFileObject;

    }

    /**
     * 获取自定义类加载器
     * @param location a location
     * @return 自定义类加载器
     */
    @Override
    public ClassLoader getClassLoader(JavaFileManager.Location location) {
        return classLoader;
    }

    /**
     * 推断二进制名称表示输出文件名称
     * 输出文件的名称通常是源文件名加上.class后缀。然而,有时候你可能希望使用不同的名称来保存输出文件
     * @param location a location
     * @param file java文件对象
     * @return 输出文件名称
     */
    @Override
    public String inferBinaryName(Location location, JavaFileObject file) {
        //类型是自定义文件对象,输出默认名称
        if (file instanceof CustomJavaFileObject) {
            return ((CustomJavaFileObject) file).binaryName();
        } else {
            return super.inferBinaryName(location, file);
        }
    }

    /**
     * 列出指定位置的所有Java文件对象
     * @param location     a location
     * @param packageName  包名
     * @param kinds        文件类型
     * @param recurse      是否包含子包
     * @return Java文件对象集合
     * @throws IOException
     */
    @Override
    public Iterable<JavaFileObject> list(Location location, String packageName, Set<JavaFileObject.Kind> kinds,
                                         boolean recurse) throws IOException {
        if (location instanceof StandardLocation) {
            String locationName = ((StandardLocation) location).name();
            for (String name : superLocationNames) {
                if (name.equals(locationName)) {
                    return super.list(location, packageName, kinds, recurse);
                }
            }
        }

        // 从指定的ClassLoader合并JavaFileObjects
        if (location == StandardLocation.CLASS_PATH && kinds.contains(JavaFileObject.Kind.CLASS)) {
            return new DynamicJavaFileManager.IterableJoin<>(super.list(location, packageName, kinds, recurse),
                finder.find(packageName));
        }

        return super.list(location, packageName, kinds, recurse);
    }

    static class IterableJoin<T> implements Iterable<T> {
        private final Iterable<T> first, next;

        public IterableJoin(Iterable<T> first, Iterable<T> next) {
            this.first = first;
            this.next = next;
        }

        @Override
        public Iterator<T> iterator() {
            return new DynamicJavaFileManager.IteratorJoin<T>(first.iterator(), next.iterator());
        }
    }

    static class IteratorJoin<T> implements Iterator<T> {
        private final Iterator<T> first, next;

        public IteratorJoin(Iterator<T> first, Iterator<T> next) {
            this.first = first;
            this.next = next;
        }

        @Override
        public boolean hasNext() {
            return first.hasNext() || next.hasNext();
        }

        @Override
        public T next() {
            if (first.hasNext()) {
                return first.next();
            }
            return next.next();
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("remove");
        }
    }

}

6.创建自定义源文件对象

public class StringJavaFileObject extends SimpleJavaFileObject {
    /**
     * 代码片段
     */
    private String contents;

    public StringJavaFileObject(String className, String content) {
        super(URI.create("string:///" + className.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
        this.contents = content;
    }

    @Override
    public CharSequence getCharContent(boolean ignoreEncodingErrors) {
        return contents;
    }
}

7.编译方法,准备编译

public class DynamicCompiler {

    /**
     * java编译器
     */
    private final JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();

    /**
     * 文件管理器
     */
    private final StandardJavaFileManager standardFileManager;
    /**
     * 编译参数
     */
    private final List<String> options = new ArrayList<String>();
    /**
     * 自定义类加载器
     */
    private final DynamicClassLoader dynamicClassLoader;
    /**
     * 需要被编译的源文件
     */
    private final Collection<JavaFileObject> compilationUnits = new ArrayList<>();
    /**
     * 编译错误信息
     */
    private final List<Diagnostic<? extends JavaFileObject>> errors = new ArrayList<>();
    /**
     * 编译警告信息
     */
    private final List<Diagnostic<? extends JavaFileObject>> warnings = new ArrayList<>();

    public DynamicCompiler(ClassLoader classLoader) {
        if (javaCompiler == null) {
            throw new RuntimeException("动态编译器初始化错误");
        }
        standardFileManager = javaCompiler.getStandardFileManager(null, null, null);
        options.add("-Xlint:unchecked");
        dynamicClassLoader = new DynamicClassLoader(classLoader);
    }

    /**
     * 添加源文件
     *
     * @param className  全路径类名
     * @param sourceCode 源代码
     */
    public void addSource(String className, String sourceCode) {
        compilationUnits.add(new StringJavaFileObject(className, sourceCode));
    }

    /**
     * 开始编译
     * @return 自定义类加载器
     */
    public DynamicClassLoader build() {
        //清空异常信息
        errors.clear();
        warnings.clear();
        //创建文件管理器
        DynamicJavaFileManager dynamicJavaFileManager = new DynamicJavaFileManager(standardFileManager, dynamicClassLoader);
        //创建编译监听器
        DiagnosticCollector<JavaFileObject> diagnosticListener = new DiagnosticCollector<>();
        //创建编译任务
        JavaCompiler.CompilationTask task = javaCompiler.getTask(null, dynamicJavaFileManager, diagnosticListener, options, null, compilationUnits);

        try {
            if (!compilationUnits.isEmpty()) {
                //开始编译
                boolean result = task.call();
                //编译失败或者存在异常信息
                if (!result || diagnosticListener.getDiagnostics().size() > 0) {
                    for (Diagnostic<? extends JavaFileObject> diagnostic : diagnosticListener.getDiagnostics()) {
                        switch (diagnostic.getKind()) {
                            case NOTE:
                            case WARNING:
                            case MANDATORY_WARNING:
                                //添加编译警告信息
                                warnings.add(diagnostic);
                                break;
                            case ERROR:
                            case OTHER:
                            default:
                                //添加编译错误信息
                                errors.add(diagnostic);
                                break;
                        }
                    }
                    if (!warnings.isEmpty()) {
                        log.warn("动态编译警告:{}", diagnosticToString(warnings));
                    }
                    if (!errors.isEmpty()) {
                        log.warn("动态编译失败:{}", diagnosticToString(warnings));
                    }
                }
            }
            return dynamicClassLoader;
        } catch (Throwable e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } finally {
            compilationUnits.clear();
        }
    }


    /**
     * 编译异常信息转字符串
     *
     * @param diagnostics 编译异常信息
     * @return 异常信息字符串
     */
    private List<String> diagnosticToString(List<Diagnostic<? extends JavaFileObject>> diagnostics) {
        List<String> diagnosticMessages = new ArrayList<>();
        for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics) {
            diagnosticMessages.add(
                "line: " + diagnostic.getLineNumber() + ", message: " + diagnostic.getMessage(Locale.US));
        }
        return diagnosticMessages;
    }
}

8.开始编译并执行

String code = "package com.example public class Example1 {\n" +
            "    public void execute() {\n" +
            "        System.out.println(\"动态编译代码片段成功执行\");\n" +
            "     }\n" +
            "}";
DynamicCompiler dynamicCompiler = new DynamicCompiler(ClassLoader.getSystemClassLoader());
        dynamicCompiler.addSource("com.example.Example1", code);
        DynamicClassLoader classLoader = dynamicCompiler.build();

//执行方法
classLoader.getClasses().get("com.example.Example1")
​​​​​​​Example1 example = (Example1) aClass.newInstance();
example.execute();

如果部署到服务器上之后编译执行报 ​​​​​​​ClassNotFoundException找不到类,请点击查看​​​​​​​JAVA动态编译执行代码片段部署后报ClassNotFoundException找不到类​​​​​​​

尝试解决 

Java中的动态编译与执行技术 在Java编程中,动态编译与执行技术为开发者提供了强大的工具,使得在运行时生成和执行Java代码成为可能。本文将介绍Java中的动态编译与执行技术,包括相关API的使用和实际应用示例。通过这些技术,开发者可以在运行时生成、编译和执行Java代码,从而提高应用程序的灵活性和扩展性。首先,脚本引擎生成Java源文件并动态编译,然后通过反射机制加载并执行生成的类和方法。在动态编译Java代码后,接下来就是动态执行生成的字节码。下面的示例展示了如何加载并执行动态编译生成的类。在上面的代码中,我们使用。 阅读详情

相关推荐

Java Compiler API 动态编译技术详解与实践

动态编译技术是现代编程语言中的重要特性,它允许程序在运行时生成和执行代码。Java通过Compiler API提供了这一能力,其核心原理是通过javax.tools包中的JavaCompiler、CompilationTask等类实现源码到字节码的转换。这项技术在规则引擎、公式计算等场景具有重要价值,能显著提升系统灵活性。在企业级应用中,结合类加载机制和性能优化策略,可以构建高效的动态代码执行环境。通过内存管理、编译缓存等工程实践,能有效解决PermGen溢出等典型问题。本文以金融风控系统为例,展示如何实现

cumo3681的博客 708

java 动态编译运行

Java Compiler 可以动态执行一段字符串形式的java代码,或手动编译java文件。

这里的分享,都是干货 3637

【Java 代码实例 4】javacompiler编译多java文件

一、ClassLoader ClassLoader是类加载器,具体的作用就是将class文件加载到jvm虚拟机中,程序就可以正常运行了。但是,JVM启动的时候,并不会一次性的加载所有的class文件,而是根据需要动态的去加载。如果一次性加载全部的jar包,内存肯定会扛不住。 1、ClassLoader 所有类加载器的基类,它是抽象的,定义了类加载最核心的操作。所有继承classloader的加载器,都会先判断是否被父类加载器加载过,防止多次加载,防止加载冲突。

学Java,找哪吒 4666

动态编译(JavaCompiler)

public class Demo01 { public static void main(String[] args) { JavaCompiler compiler= ToolProvider.getSystemJavaCompiler(); int result=compiler.run(null, null, null,"d:/myC/Hello...

weixin_39996256的博客 6819

Compiler类,你学会了吗?

Compiler 类是 Java.lang 包中的一部分,它用于动态编译 Java 代码。通过使用 Compiler 类,程序员可以在运行时动态地编译 Java 源代码,并且可以将编译后的字节码加载到当前的 Java 虚拟机中执行。Compiler 类提供了一种动态编译 Java 代码的机制,可以实现一些动态生成代码、动态加载类等功能。

良月柒 637

JVM 动态执行Groovy脚本的方法

对javax.script包进行讲解,实现支持java动态嵌入执行groovy代码片段

java内存动态编译执行

1.package org.jui.core.dynamic;  public class DynaCompTest {     public static void main(String[] args) throws Exception {         String fullName = "DynaClass";         StringBuilder src = new St

cjings的专栏 539

Java动态编译Java代码,运行在内存中,并执行

*1.创建 URLClassLoader 类加载器 * 2.获取当前执行的classpath的所有jar包的路径 * 3.通过java的ToolProvider创建JavaCompile,用来执行class源文件 * 4.创建DiagnosticCollector用来执行获取执行失败的错误结果 * 5.添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并执行 * 8.获取执行完成后的返回JavaClassObject类 * 9.创建DynamicClassLoader来加载类 ,defineClass这个方法

Java动态编译

自定义函数能力,ETL,动态编译

kj_1314的博客 1298

逆向实战:从x-mini签名到RPC调用,Frida动态分析小红书加密协议

本文通过实战案例,详细拆解了小红书App的加密协议逆向分析过程。从识别x-mini签名等关键参数入手,结合静态分析与Frida动态Hook技术,追踪到核心的RPC调用入口,并最终封装成可独立调用的RPC函数,为安全研究和协议理解提供了完整的技术路径。

moss5的博客 1032

二进制、八进制、十六进制、十进制转换详解

二进制是计算机的语言,正如我们使用汉语表达与交流信息一样,任何信息在计算机中都以二进制的形式存储和计算。了解二进制与十进制等进制之间的转换方法,有助于我们了解计算机内部的数字计算过程,可以帮助我们在一定程度上理解信息在计算机中的编码和解码过程。本文先简单介绍位置化数字系统的概念,然后详细讲解二进制、八进制、十六进制、十进制之间的转换方法与原理。

2301_81674797的博客 2097

Java中的动态编译与运行

动态编译和运行在Java中是一种强大的能力,它允许程序在运行时动态地生成和加载Java类,执行代码并获取结果。这种技术在很多场景下都非常有用,比如动态代码生成、插件系统、实时代码修改和执行等。本文介绍了Java中动态编译与运行的基本原理、使用方法以及常见应用场景。通过灵活利用动态编译技术,开发人员可以实现更加灵活和可扩展的应用程序设计。大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!微赚淘客系统3.0小编出品,必属精品!

微赚淘客开发者博客 611

Cisco Secure ACS 5.8.0.32 安装 + Crack 教程

在ESXi 6.7 上经历过无数次的安装尝试测试了各种兼容版本都没有安装成功,记最后一次安装成功的过程.

Junior's Blog 3538

eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件

导读: 最近在看 Flink 源码的时候发现到一段实用的代码,该代码实现了 java 动态编译以及生成 jar 文件。将其进行改进后可以应用到我们的平台上,实现在平台页面上编写 java 代码语句,提交后由后台进行编译和打成 Jar 包再上传到指定的文件存储系统,从而代替之前在本地自己手动打 UDF 包的方式。下面我将对这段代码做一些简单分析,希望对各位有所帮助。核心代码public class ...

weixin_39562615的博客 2879

ESXI 7 :创建统信V20_1050d服务器系统虚拟机

记录一下在 X86 架构创建统信V20_1050d 虚拟机遇到的问题。已遇到的问题有①:常规服务器环境下网络连接失败重点:按照桌面版本,有问题处理简单。

guyuelin123的博客 1968

从HCI层浅析LE Audio通话建立流程

本文分析了BLE AUDIO通话协议建立的全过程。当手机来电时,系统会通过CCP EATT链路通知耳机准备通话,并断开原有音乐CIS连接。随后建立通话专用的CIG组,其参数设置(如MAX SDU SIZE=80、RTN=2)与音乐场景明显不同,更注重通话的实时性。文中详细描述了设置ISO数据路径、启用ASE、建立CIS连接等关键步骤,特别指出通话采用Conversational音频上下文类型。最后解析了ISO数据包参数含义,展示了10ms周期、32kHz采样率等通话特性参数。整个过程体现了BLE AUDIO

十多年蓝牙协议软件开发,擅长蓝牙协议分析 1861

java代码_动态编译 Java 代码以及生成 Jar 文件

导读: 最近在看 Flink 源码的时候发现到一段实用的代码,该代码实现了 java 动态编译以及生成 jar 文件。将其进行改进后可以应用到我们的平台上,实现在平台页面上编写 java 代码语句,提交后由后台进行编译和打成 Jar 包再上传到指定的文件存储系统,从而代替之前在本地自己手动打 UDF 包的方式。下面我将对这段代码做一些简单分析,希望对各位有所帮助。核心代码public class ...

weixin_39622980的博客 822

带有HSE组件的S32系列芯片中各子系统如何依次启动?

仔细阐述了上电后各个子系统的启动顺序,并给出了详细的启动步骤流程图。

车载系统攻城狮 1702

指定jar生成路径_动态编译 Java 代码以及生成 Jar 文件

导读: 最近在看 Flink 源码的时候发现到一段实用的代码,该代码实现了 java 动态编译以及生成 jar 文件。将其进行改进后可以应用到我们的平台上,实现在平台页面上编写 java 代码语句,提交后由后台进行编译和打成 Jar 包再上传到指定的文件存储系统,从而代替之前在本地自己手动打 UDF 包的方式。下面我将对这段代码做一些简单分析,希望对各位有所帮助。核心代码public class ...

weixin_39839968的博客 422

Python 爬虫实战:去哪儿网机票价格爬取与出行比价分析

本文介绍了一个基于Python的机票价格监控系统,通过爬取去哪儿网数据实现多航线查询与智能比价。系统采用requests+BeautifulSoup+selenium技术栈,具备以下功能: 实时查询指定航线价格 历史价格追踪与分析 最低价推荐与价格预警 数据可视化展示 文章详细解析了去哪儿网的页面结构和反爬机制,提供了Selenium浏览器的完整配置方案,并实现了一个可稳定运行的机票采集爬虫。该系统能帮助用户掌握价格波动规律,选择最优购票时机,每年可节省可观的出行成本。

u014481728的博客 672

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1045

Java动态编译技术实现与应用场景解析

动态编译是Java开发中的一项核心技术,它允许程序在运行时将字符串形式的Java代码编译为可执行的字节码。这项技术基于Java Compiler API实现,通过javax.tools包提供的工具类完成源代码到字节码的转换。动态编译的价值在于它打破了传统开发中必须先编译后执行的限制,为系统带来了极大的灵活性。在工程实践中,这项技术广泛应用于在线编程教育、规则引擎、插件系统等场景,特别是在需要实时执行用户自定义代码的低代码平台中尤为重要。实现时需要注意类加载机制、依赖管理和错误处理等关键点,同时必须考虑安全防

weixin_34378969的博客 488

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java 动态编译框架_利用 JDK6 动态编译组件搭建 OSGi 运行时编译环境

JDK6 动态编译组件Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序。该包中提供主要类可以从 Java String、StringBuffer 或其他 CharSequence 中获取源代码并进行编译。接下来通过代码一步步讲述如何利用 JDK6 特性进行运行时编译。清单 1. JDK...

weixin_35037351的博客 360

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java动态执行代码字符串

/获取系统Java编译器//获取Java文件管理器//定义要编译的源文件//通过源文件获取到要编译的Java类源码迭代器,包括所有内部类,其中每个类都是一个 JavaFileObject,也被称为一个汇编单元Iterable

qq_30436011的博客 6148

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

javacompiler编译java文件_java-compiler-api – 使用Java Compiler API编译多个java文件

我能够通过编译所有java文件来解决这个问题.使用FTL我生成java类,然后使用java编译器api编译它,并使用自定义类加载器加载类Java Complierprivate void compile(File[] files) throws IOException{String classpath=System.getProperty("java.class.path");String ro...

weixin_27017211的博客 416

使用JCompiler实现JAVA代码内存中动态编译

第一部分 简介 JCompiler是用Java 编写的用来将Java源代码动态编译为字节码的辅助工具,开发者可以动态生成源代码并在内存中将其进行编译并获得编译后的类对象。 第二部分 开始使用 使用JCompiler可以直接下载源代码编译或者下载已经编译的jar文件,如果您是使用maven来构建项目,也可以直接在pom.xml中添加JCompiler的坐标: <!-- http://mvnrepository.com/artifact/com.jianggujin/JCompiler --> &l

蒋固金(jianggujin)的专栏 839
下一篇: JAVA动态编译执行代码片段部署后报ClassNotFoundException找不到类
yondd
博客等级 码龄9年 170粉丝 3原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值