【问题标题】:How can a static method get instance details or do instance specific actions静态方法如何获取实例详细信息或执行特定于实例的操作
【发布时间】:2016-09-12 02:46:28
【问题描述】:

下面的代码显然不会编译。

public class Machine {
  public int id;
  static Machine staticMethod() { return this; } //compilation error - "Cannot use this in a static context"
  maskId() {   }
}

所以不可能从 staticMethod()
(1) 获取特定于任何 Machine 对象实例的信息
(2) 执行特定于任何 Machine 对象

实例的操作

除非我错过了一些非常简单的事情。

Thread类的静态方法如何处理特定线程的动作/信息。
以下是来自 java docs Thread

的此类方法的签名

static Thread currentThread() //返回对当前正在执行的线程对象的引用。
static void dumpStack() //将当前线程的堆栈跟踪打印到标准错误流中。

我是不是错过了什么。或者这些方法(或线程类)不同。像本机实现等或其他任何东西,但能够确定调用实例。

【问题讨论】:

  • currentThread 是本机方法。 dumpStack 不依赖于任何实例,所以它不需要做任何特别的事情。 Source
  • “当前线程”不等于“调用此方法的线程对象实例”。事实上,如果没有方法currentThread,就没有办法得到这些信息。
  • @ErwinBolwidt 没错。 native 鸡和蛋的解决方案。

标签: java oop jvm instance static-methods


【解决方案1】:

【讨论】:

  • gr8。我没有进一步的具体问题,因为本机实现就是答案。 但想请教任何阅读这篇文章或评论的人: 可以一些很好的参考来学习和理解如何实现本机类或方法 - (JNI)。有优点和缺点,什么时候应该实际使用它们,或者什么时候 JNI 是唯一的选择。
  • 这是一个很好的起点:blogs.oracle.com/moonocean/entry/a_simple_example_of_jni。用例和优缺点对于一个问题来说过于宽泛,这取决于具体问题。
【解决方案2】:

线程可以询问;我是哪个线程?在任何时候。它不需要像大多数值那样将其作为参数传递给它。有一个 static native 方法提供当前线程,并且从那里该对象可以调用实例方法。

【讨论】:

    【解决方案3】:

    我认为这是由调度程序完成的, 这里我提到类结构(这是我的看法,它是如何工作的)

    class Thread{
    static currentThread();
    
    }
    
    Class Scheduler{
    //it has queue of all threads and also has track on current running thread 
    //queue = {Thread1,Thread2,Thread3,Thread4,Thread5}
    // let thread3 is running, whenever a call to Thread3.currentThread come up 
    //some how jvm get instance of Thread3 from this queue and returns.
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多