【问题标题】:calling non static method from static class in java with spring autowiring?使用spring自动装配从java中的静态类调用非静态方法?
【发布时间】:2013-11-13 06:25:35
【问题描述】:

我有下面的接口及其实现类。

Demo.java

public interface Demo{

 void showDemo();

}

DemoImpl.java

@Service
public class DemoImpl implements Demo{

  public void showDemo(){

       //To Do

    }

}

现在我有一个带有静态方法的类,它将在内部调用showDemo(),如下所示。

DemoStatic.java

@Component
public class DemoStatic{

 @Autowired
 private Demo demo;



     public static void callShowDemo(){

       demo.showDemo(); //calling non static method from static method

       }

}

这里我从静态方法调用非静态方法。我的设计正确吗?还是我需要改变我的设计?请给我建议。

谢谢!

【问题讨论】:

  • 不能从静态方法调用非静态方法。它不会编译。
  • 嗯,你可以,但你必须指定哪个对象调用非静态方法on
  • 这种情况下,方法调用其实是可以的;问题是对非静态变量demo 的引用。 DemoStatic 可以有多个实例,每个实例都有自己的 demo 变量。
  • 你可以注入 bean 并在你需要的地方调用showDemo(),不需要静态

标签: java spring jakarta-ee


【解决方案1】:

你可以这样做

@Component
public class DemoStatic {

 private static Demo demo;

 @Autowired
 public void setDemo(Demo d) {
     demo = d;
 }

  public static void callShowDemo(){
       demo.showDemo(); //calling static method from static method
  }

}

【讨论】:

    【解决方案2】:

    不,您的设计不正确。

    private Demo demo;
    

    必须是

    private static Demo demo;
    

    你不能在静态方法中使用非静态成员

    【讨论】:

    • Doltan,如果我将 Demo 变量设为静态,会有什么问题吗?谢谢!
    • 不,不会有问题。但是元素是静态的,你应该知道静态是什么意思。
    • 声明应该是“你不能在静态方法中使用非静态成员”
    【解决方案3】:

    上面的代码根本不会编译。您正在尝试从静态方法引用非静态引用,这在 Java 中是不允许的。

    请参阅此stackoverflow 链接以获得更好的理解。

    进行以下更改:

    public static Demo demo;
    

    【讨论】:

    • Spring 可以自动装配静态字段吗?!
    • @SilviuBurcea :我在 Springs 方面没有太多专业知识,因此无法对此发表评论。
    【解决方案4】:

    当你调用DemoStatic.callShowDemo()时,demo可能没有被实例化

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多