有没有一种方法可以在Javascript中编写类似于toString的Java方法,如果在方法上调用该方法,则会打印该方法的源代码?

时间:2019-02-25 01:58:27

标签: javascript java compilation

对不起,如果这是一个琐碎的问题,那么如果已经提出了此问题,请引导我解决该问题。

我知道javascript中的tostring方法(如果在函数上调用)将打印源代码(有关它的更多信息:link)。用Java可以做同样的事情吗?

因此,如果我具有以下身份函数定义:

public class class1 {

    int f1(int x){
        return  x;
    }
}

以及以下主要功能:

class Main {
    public static void main(String args[]) {

        class1 c1 = new class1();

        ???? 

    }
}

我可以代替“ ????”吗?会打印出

int f1(int x){
    return  x;
}

2 个答案:

答案 0 :(得分:1)

免责声明:我不是Java或与此相​​关的任何编程语言的专家。但是,我确实知道如何在线查找信息。

这个概念在Java中似乎不太可行。要开始:

  

JavaScript is an interpreted language, not a compiled language.在运行之前需要先编译诸如C ++或 Java 之类的程序。源代码通过称为编译器的程序传递,该程序将其转换为机器可以理解并可以执行的字节码。相反,JavaScript没有编译步骤。取而代之的是,浏览器中的解释器读取JavaScript代码,解释每一行并运行它。越来越多的现代浏览器使用称为即时(JIT)编译的技术,该技术可以在即将运行时将JavaScript编译为可执行的字节码。

基本上,JavaScript具有直接从带有源代码的文件中读取并即时执行它的优势。出于多种原因(包括安全性),默认情况下,诸如Java之类的编译语言默认不会内置这种功能。应用程序应该能够在不允许黑客尽可能多地访问其源代码的情况下运行。

尝试过进行各种形式的感兴趣的操作,但是似乎最简单的两种方法是

  1. 逐行打印原始.java文件
  2. 存储对整个代码或所需方法的字符串引用。

似乎也可以打印方法名称,而不是正文。

除此之外,从编译的,正在运行的Java程序中唯​​一可以获得的就是字节码,这将要求反编译器有希望了解其背后的源代码。

您可以通过此处的一些链接继续阅读它:

How do I print the method body reflectively?

Save a method into a variable, java 8

View a method's implementation (method body) using Java Reflection

答案 1 :(得分:1)

可能是的,但是使用ready命令却不是一件容易的事。 JavaScript是一种解释型语言,执行环境可以访问其原始格式的源代码。这样便可以在浏览器控制台中对其进行检查,并查看与源代码中相同的变量名称。

尽管已编译/解释的区别为fuzzy for Java,但肯定在执行之前对其进行了修改。 Java的即时编译所使用的bytecode可能比完全编译的二进制文件更具可读性,它不是源文件。如果正在运行的程序无权访问源代码,则输出它的能力将降低。在IDE中运行的调试器可以引用源代码中的问题。否则,您只能使用debugging the bytecodes

这就是为什么Keno Clayton在Quine程序上提出这个问题的原因,该程序旨在自我复制。 This answer通过将源代码硬编码为类属性来输出源代码。您可以对预编译脚本采用类似的方法,该脚本会遍历所有方法并从其源中提取字符串,但结果会很庞大且可能很敏感。