`
杭州猛男Cook.Mr
  • 浏览: 3685 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java编程思想-动态编译

阅读更多

 

一般,我们用反射是可以在运行时洞悉一个类的信息(无论公私有),但是我们也可以在运行时创建一个新的类(原先不存在),然后加载该类,并调用该类中的函数。

 

1.创建一个类

这里我简便的用IO流将一个已经完成的类(与当前工程不再一个目录下),拷贝到当前工程目录下,当然也可以在运行时直接用字符串拼接处一个类,写入文件。

 

@SuppressWarnings("resource")
public static void copyClass() throws IOException{
File file = new File("src/com/annotation/AnnotationDemo.java");
FileChannel in = new FileInputStream("/Users/admin/Desktop/Hello.java").getChannel();
FileChannel out = new FileOutputStream("src/com/annotation/Hello.java").getChannel();
ByteBuffer buff = ByteBuffer.allocate(1024);
while(in.read(buff) != -1){
buff.flip();
out.write(buff);
buff.clear();
}
out.close();
in.close();

}

 

 

 

2.加载该类

由于我们创建好的类(文件)是.java,且该文件相当于是一种非正常途径建立的,所以并没有被编译过,所以要进行编译产生.class文件。

但是这里不能使用:

RunTime run = RunTime.getRunTime();

run.exec(command); //command = javac classname.java

因为他不会被执行

所以这里要使用专门的类编译工具,由JDK直接提供。

 

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
Iterable units = fileMgr.getJavaFileObjects("src/com/annotation/Hello.java");
CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
t.call();
fileMgr.close();

 

 

 

还有一点要注意的是,编译后的类直接在.java文件的同级目录下(当然也可以设置成将编译后产生的.class文件让入相应的位置),一般我们用eclipes的话 .class文件放在bin文件下,.java文件放在.src文件下的,所以我在这里做一个文件挪动的工作:

 

Runtime run = Runtime.getRuntime();
  run.exec("mv 目标.class当前路径 "+ "该.class应该被存放的路径");

 

 

 

 

3.反射调用

Class c = Class.forName("com.annotation.Hello");
Object o = c.newInstance();
Method m = c.getMethod("hello");
m.invoke(o);
System.out.println(c.getName());

 

因为类已经加载好了,所以我们就可以使用它的,当然是用反射的方式来调用,这种情况下,与一般的反射并没有区别了。

 

4.输出结果

helloworld

 

com.annotation.Hello

 

5.总结

 

其实这个例子意义并不大,只是感觉这应该是个比较偏门的东西,就拿出来分享一下,java并非在运行时不能创建类,相反的,java在运行时可以创建一个类,其实本质就相当于创建一个文件,但是重要的是如何要这个类被编译,这里只能使用javax提供的显示的类编译工具,一旦编译完成,产生.class文件后,之后的操作就一样了。

我想到的用途:

实现一个在线编译功能。(这样的话就变成调用另一个类的main方法。)

热部署(不停机替换文件)

 

缺点:

其实静态编译就已经能够完成绝大部分功能,并没有很大的需求使用动态编译

动态编译在框架中使用需要比较谨慎,比如在spring中动态编译一个类并把他加入到bean容器中是非常麻烦的

有其他更好的无缝脚本来支持动态编译,比如Groovy.

毕竟是一个编译过程,还是比较费时的

 

会产生注入漏洞,万一源代码来源有恶意BUG,编译之后可能产生安全隐患。

分享到:
评论

相关推荐

    侯捷-java编程思想.pdf

    《侯捷-Java编程思想》是一本深受Java开发者喜爱的经典著作,尽管是繁体版本,但其中也包含英文内容,方便不同语言背景的读者理解。这本书深入浅出地讲解了Java编程的核心概念和技术,旨在帮助读者掌握Java编程的...

    Java编程思想侯捷编译第二版

    《Java编程思想》是Java开发领域的一本经典著作,由美国著名程序员Bruce Eckel撰写,侯捷翻译的中文版在中文读者中广受欢迎。这本书深入浅出地介绍了Java语言的核心概念和技术,对于初学者和有经验的开发者来说,都...

    C++编程思想-英文版

    这本书全面、深入地介绍了C++语言,不仅覆盖了基础语法,还包括了高级特性和设计模式,旨在帮助读者理解C++的核心理念和编程思想。 1. **C++概述**:C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅...

    java 编程思想java初学

    《Java编程思想》是Java初学者的一本经典教材,它以其深入浅出的讲解和丰富的实例,深受读者喜爱。本书全面覆盖了Java的基础知识,包括语法特性、面向对象编程概念、异常处理、集合框架、多线程、网络编程等多个方面...

    Java 编程思想中文第三版(PDF)

    《Java编程思想》是Java开发领域的一本经典著作,由Bruce Eckel撰写,中文第三版则是针对中国读者的翻译版本,旨在帮助读者深入理解和掌握Java编程语言。这本书以清晰、简洁的语言介绍了Java的核心概念和技术,适合...

    Java编程思想源代码及课后练习代码

    《Java编程思想》是一本由 Bruce Eckel 编著的经典Java教程,对于初学者和有经验的程序员来说,都是深入理解Java语言的重要参考书。这本书深入浅出地讲解了Java的核心概念,包括面向对象编程、泛型、并发、集合框架...

    JAVA编程思想习题及答案

    《JAVA编程思想习题及答案》是一份针对Java编程学习者的宝贵资源,它涵盖了Java语言的核心概念、设计模式以及实际编程技巧。这份资料通过习题的形式帮助学习者深入理解和掌握Java编程思想,同时提供了解答,使学习...

    Java编程思想练习题答案(代码)

    在Java编程领域,掌握《Java编程思想》是深入理解这门语言的重要步骤。这本书由Bruce Eckel撰写,被誉为Java学习者的经典之作。本资源包含了该书第四版的完整练习题答案,旨在帮助读者巩固和深化对书中理论的理解,...

    Java编程思想习题答案代码

    《Java编程思想习题答案代码》是一份针对学习Java编程思想的宝贵资源,它提供了书中的课后习题解答,旨在帮助学习者在探索Java语言的过程中进行实践和检验自己的理解。这份资料通常与《Thinking in Java》这本书配套...

    java编程思想读书笔记

    《Java编程思想》是 Bruce Eckel 的经典著作,这本书深入浅出地讲解了Java语言的核心概念和编程技术。这份读书笔记记录了读者在研读此书过程中的理解和体会,涵盖了从基础语法到高级特性的全面解析。以下是笔记中...

    Java编程思想练习题答案

    《Java编程思想》是Java程序员必读的经典书籍之一,它深入浅出地讲解了Java语言的核心概念和技术。这本书不仅提供了理论知识,更重要的是通过一系列的练习题帮助读者巩固理解并应用所学。以下是对"Java编程思想练习...

    java编程思想课后题答案

    《Java编程思想》是 Bruce Eckel 的经典之作,这本书深入浅出地讲解了Java语言的各个方面,对于初学者和有经验的开发者都是宝贵的资源。课后习题解答则是学习过程中不可或缺的一部分,它提供了实践和检验理论知识的...

    java编程思想课后题目源码实现

    【标题】"java编程思想课后题目源码实现"揭示了这个压缩包是关于学习《Java编程思想》一书的配套源代码实现。这本书由Bruce Eckel撰写,深入浅出地介绍了Java编程语言的核心概念和技术。这个资源包含了书中各个章节...

    java编程思想练习题答案

    《Java编程思想》是Bruce Eckel的经典之作,它深入浅出地介绍了Java语言的核心概念和技术。这本书中的练习题是学习者提升技能的重要途径,而这个压缩包提供的就是这些练习题的解答,以源码的形式保存为.java文件。...

    Java编程思想 Thinking in Java 课后习题答案

    《Java编程思想》是 Bruce Eckel 的经典著作,它深入浅出地讲解了Java语言的核心概念和编程技术。这本书不仅提供了丰富的理论知识,还包含了大量练习题,旨在帮助读者巩固和提升编程技能。课后习题答案对于学习者来...

    Java编程思想读书笔记.doc

    ### Java编程思想读书笔记知识点梳理 #### 第1、2章:万事万物皆对象 ##### 一、所有对象都必须由你建立 - **存储位置**: - **寄存器**:程序中不可控。 - **栈 (Stack)**:存放基本类型数据和对象引用,对象...

    java 编程思想

    java 编程思想,是已经编译的文档,是.cbm格式的文档

Global site tag (gtag.js) - Google Analytics