源代码可以在运行时操纵其他或自身吗?

时间:2014-06-18 18:51:15

标签: java file-io

例如,两个源代码的编写方式是,它们都返回一个数字并打印出一个随机字符串(例如:"我已经死亡次数为#34;)。这里重要的一点是,从一个程序返回的数字是添加到另一个程序的字符串的数字。还应该考虑的一件事是两个程序假设干预其他源代码然后永远运行它。这意味着一个程序的返回值实际上是操纵另一个程序的主要因素。

问题:是否可行,(例如在java中)如果程序可以改变自己的源代码吗?

3 个答案:

答案 0 :(得分:5)

是的,它在理论上是可行的。 Self-modifying code是计算机科学的一个完整分支。

但是在现实世界中这很少是一个好主意,如果你打算这样做,Java(或其他编译语言)可能不是最好的选择。 Javascript,PHP,Python(例如What does Python's eval() do? ),Ruby,Groovy等都提供了运行任意代码的方法,这些代码本身可以生成其他任意代码......但调试,保护,测试和证明它正在做的事情是噩梦是对的。

通常最好仔细设计你的程序,正如另一张海报所说,使用数据结构,而不是本机源代码。

答案 1 :(得分:1)

是的,这是可能的,并不是那么罕见。

Javassist之类的库可用于在运行时操作代码(字节代码)。这用于例如用于记录框架,分析器或Hibernate之类的东西。所有这些框架都可以在您的应用程序的现有代码中注入新代码,例如:监控它。

我写了一次负载均衡器,可以用现有的应用程序启动。然后负载均衡器获取已经编译的应用程序代码(可以是任何JDBC应用程序)并注入一些控制语句。所有在运行期间。

答案 2 :(得分:-2)

您可以使用设置文件,例如“number.ini”,而不是编辑源代码文件(这可能是一个不明智的路径,因为您可能会意外地弄乱您的源代码)。在这个文件中,你可以写一个数字,然后程序会读取这个文件并解析数字,打印字符串X的次数(取决于数字是多少),然后在这个文件中写一个新的数字。

这将消除您的源代码被意外销毁的可能性,并将删除可能出现的任何“使用中的文件”冲突。