java编程思想-动态编译

本文介绍如何在Java中动态创建类、编译类并利用反射调用类中的方法,包括创建类、编译类、加载类及反射调用的详细步骤,最后讨论了这种方法的应用场景和潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

 

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,编译之后可能产生安全隐患。

内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在三维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的三维超分辨成像。文章不仅涵盖了系统硬件的设计与实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描与常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的三维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类与病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在三维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值