是否可以通过在Java中导入类来运行代码?

是否可以通过在Java中导入类来运行代码?,java,output-buffering,Java,Output Buffering,在这个单类库中,如果客户机导入该类,我需要禁用stderr和stdout上的缓冲,使用 //stderr FileOutputStream fderr=新的FileOutputStream(FileDescriptor.err); //stdout FileOutputStream fdout=新的FileOutputStream(FileDescriptor.out); //大小为1的stderr缓冲区 BufferedOutputStream errBuf=新的BufferedOutputS

在这个单类库中,如果客户机导入该类,我需要禁用stderr和stdout上的缓冲,使用

//stderr
FileOutputStream fderr=新的FileOutputStream(FileDescriptor.err);
//stdout
FileOutputStream fdout=新的FileOutputStream(FileDescriptor.out);
//大小为1的stderr缓冲区
BufferedOutputStream errBuf=新的BufferedOutputStream(fderr,1);
//大小为1的标准输出缓冲区
BufferedOutputStream EXFOR=新的BufferedOutputStream(fdout,1);
//向stderr和stdout添加更多特性和功能
PrintStream errStream=新的PrintStream(errBuf);
PrintStream outStream=新的打印流(EXBUF);
//更新stderr和stderr
System.setErr(errStream);
系统放线(扩流);

遇到过,但不幸的是,他们只跑得特别快,我对这些都不感兴趣。在Java中,是否有任何方法仅通过导入包含类(即,仅导入import语句;而不调用任何方法等)来运行上述代码?

您找错了地方

如果希望应用程序将所有stdout/stderr消息发送到特定流中;然后,您“只是”希望在“JVM启动”级别上控制它。换句话说:您应该尽早研究操纵JVM的方法

当您的一些类被“导入”时,您不希望将重定向放在适当的位置;您希望有一种健壮的方式,在启动时直接告诉JVM这样做

但是当然:做这些事情的真正明智的方法是使用一个日志框架,它允许更好地控制正在发生的事情。首先,登录到stdout/stderr不是一个好方法


编辑:鉴于这是关于学生的“训练轮”;然后,只需在一些库类中放入一个静态设置方法(理想情况下是使用表示stdout/stderr应该指向的文件名的字符串);并指导你的学生在他们的主要方法中首先调用该方法

你找错地方了

如果希望应用程序将所有stdout/stderr消息发送到特定流中;然后,您“只是”希望在“JVM启动”级别上控制它。换句话说:您应该尽早研究操纵JVM的方法

当您的一些类被“导入”时,您不希望将重定向放在适当的位置;您希望有一种健壮的方式,在启动时直接告诉JVM这样做

但是当然:做这些事情的真正明智的方法是使用一个日志框架,它允许更好地控制正在发生的事情。首先,登录到stdout/stderr不是一个好方法


编辑:鉴于这是关于学生的“训练轮”;然后,只需在一些库类中放入一个静态设置方法(理想情况下是使用表示stdout/stderr应该指向的文件名的字符串);并指导你的学生在他们的主要方法中首先调用该方法

导入仅在编译时使用

您说静态初始值设定项不感兴趣。但是,静态初始值设定项在加载类时运行。如果不加载类,就无法从类中运行代码,因此我想说静态初始值设定项正是您想要的

客户端可以加载一个类而不必实例化它,例如使用class.forName

范例

public class Foo
{
    static
    {
        System.out.println("Class foo loaded");
    }
}

// different file...
public class Client
{
    static
    {
        try {
            Class.forName("Foo");
        }catch (ClassNotFoundException e) {
            // TODO
        }
    }
    public static void main (String args[]) {
    // Nothing to do in this demo. The static intitizlier in
    // this class causes Foo to be loaded and thus invokes Foo's 
    // static initializer
   }
}

导入仅在编译时使用

您说静态初始值设定项不感兴趣。但是,静态初始值设定项在加载类时运行。如果不加载类,就无法从类中运行代码,因此我想说静态初始值设定项正是您想要的

客户端可以加载一个类而不必实例化它,例如使用class.forName

范例

public class Foo
{
    static
    {
        System.out.println("Class foo loaded");
    }
}

// different file...
public class Client
{
    static
    {
        try {
            Class.forName("Foo");
        }catch (ClassNotFoundException e) {
            // TODO
        }
    }
    public static void main (String args[]) {
    // Nothing to do in this demo. The static intitizlier in
    // this class causes Foo to be loaded and thus invokes Foo's 
    // static initializer
   }
}

我认为不仅仅是导入,您还需要查看注释,可能还需要编写自己的注释。
import
语句对运行时没有任何影响,它们只为编译器提供名称解析服务。但即使它真的起作用了,这也是一个可怕的想法,因为IDE会标记并自动删除未使用的导入语句。我认为,不仅仅是导入,您还必须查看注释,可能还要编写自己的注释。
import
语句对运行时没有任何影响,它们只为编译器提供名称解析服务。但即使它真的起作用了,这也将是一个可怕的想法,因为IDE会标记并自动删除未使用的导入语句。这实际上是出于教学目的,我们在一开始就将此库作为培训轮提供。并不是说我们贬低了对流缓冲的学习,而是我们不希望学生体验/关心缓冲,尤其是在开始时,为了简单起见。出于同样的原因,日志框架可能也不是我们的选择。但是谢谢你的投入!听起来没有比这更简单的方法了!谢谢这实际上是出于教学动机,因此我们在开始时将此库作为培训轮提供。并不是说我们贬低了对流缓冲的学习,而是我们不希望学生体验/关心缓冲,尤其是在开始时,为了简单起见。出于同样的原因,日志框架可能也不是我们的选择。但是谢谢你的投入!听起来没有比这更简单的方法了!谢谢