当前位置: 首页 > 知识库问答 >
问题:

在不知道公共类名的情况下编译. java文件

叶英哲
2023-03-14

我想知道如何编译。不知道公共类名的java文件。

提供一个示例用例:我正在操作一个沙盒,允许用户向我发送一个字符串。我将该字符串写入。我编译的java文件评估生成的类并回复输出。

?????.Java语言

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}

如果我随机分配?????。java是一个名称,例如test。java并运行命令javac测试。那么它就会失败

错误:类HelloWorld是公共的,应该在名为HelloW的文件中声明orld.java如下所示:

你好orld.java

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}

这可能吗?我应该放弃编译Java的能力,还是有其他解决方案?

共有3个答案

麻书
2023-03-14

如果我随机分配??????. java一个名字,比如test.java,然后运行javac命令test.java那么它会失败

错误:类HelloWorld是公共的,应该在名为HelloW的文件中声明orld.java

好的,请看错误消息!编译器会告诉您文件名应该是什么,这很有帮助。不要丢弃这些信息。分析错误消息以找到正确的文件名,重新命名文件,然后重试。

秦俊
2023-03-14

如果不将该类声明为公共类,则实际上可以编译该类。

例子:

class Test {
   public static void main(String[] args) {
       System.out.println("Hello world");
   }
}

将文件另存为. java,并在cmd上编译

javac .java

之后可以使用类名运行

java Test
卢子民
2023-03-14

好为了能够评估自定义代码,您还必须知道带有main方法的类名。

我认为最便宜的方法是强迫用户坚持某种代码约定,即“包名应该是foo.bar.baz的,类名是Qux的,主类是强制性的”。在这种情况下,您可以按原样将错误消息从编译器传递给用户,并显示代码约定。

不那么快的方法是做一些肮脏的把戏,比如用另一个名称已知的类正确包装收到的代码,搞乱包名称,然后尝试对内部类main方法进行反射调用,但在这种情况下,您会遇到正确的错误报告问题,很容易出错。

正确且可能很长的方法是采用java源代码解析器(像这样),构建AST,找到顶级类,根据包/类名重命名文件,并执行javac(甚至从AST生成字节码)。

编辑

您还可以使用java-repl项目。这可以让您评估类似脚本的程序。

希望有帮助!

 类似资料:
  • 本文向大家介绍MySQL在不知道列名情况下的注入详解,包括了MySQL在不知道列名情况下的注入详解的使用技巧和注意事项,需要的朋友参考一下 前言 最近感觉脑子空空,全在为了刷洞去挖洞,还是回归技术的本身让自己舒服些。好了,下面话不多说了,来一起看看详细的介绍吧 前提 以下情况适用于 MySQL < 5版本,或者在 MySQL >= 5 的版本[存在information_schema库],且已获取

  • 问题内容: 在Django中,当您有一个父类和从其继承的多个子类时,通常可以通过parentclass.childclass1_set或parentclass.childclass2_set访问一个子类,但是如果我不知道我想要的特定子类的名称怎么办? 有没有一种方法可以在不知道子类名称的情况下沿parent-> child方向获取相关对象? 问题答案: (更新:对于Django 1.2及更高版本,

  • 我知道我可以给单只熊猫重新命名。DataFrame列具有: 但是我想在不知道列名称的情况下重命名它(基于它的索引-尽管我知道字典没有)。我想重命名第1列,如下所示: 但是在DataFrame.columns dict中没有“1”条目,因此不进行重命名。我怎样才能做到这一点?

  • 问题内容: 我试图解析Java中的JSON字符串并找到键值对,以便我可以确定JSON对象的近似结构,因为JSON字符串的对象结构是未知的。 例如,一个执行可能具有这样的JSON字符串: 另一个像这样: 如何遍历各种JSON元素并确定键及其值?我看着的。我知道如何获取下一个“令牌”并确定令牌的类型(即字段名称,值,数组开头等),但是,我不知道如何获取实际令牌的值。 例如: 或其他库(或)中是否有一个

  • 问题内容: 这是我的json: 有什么方法可以在不知道键是什么的情况下访问此数组中的键和值(在javascript中)? 我的json这样构造的原因是,我通过jquery调用的网络方法正在返回字典。如果无法使用上述方法,那么我需要对返回数据的方式进行哪些更改? 这是我的网络方法的概述: 问题答案: 您可以使用该构造遍历对象的任意属性:

  • 问题内容: 我正在使用gob将结构序列化到磁盘。有问题的结构包含一个接口字段,因此具体类型需要使用进行注册。 这里的难题是,进行灌装的图书馆应忽略所使用的混凝土类型。我希望即使调用者定义了自己的接口实现,也可以进行序列化。 我可以通过动态注册类型来成功编码数据(请参见下面的简单示例),但是在尝试重新读取数据时,gob拒绝接受未注册的类型。它令人沮丧,因为感觉好像所有数据都在那里- 如果gob 标记