8

我希望能够在运行时实现一个在对象运行初始化程序之前调用的方法。这将允许我设置在初始化期间使用的字段。

这是一个例子:

class A {
  public A() {
    initialize();
  }
  public void initialize() { }
}

class B extends A {
  public String message;
  {
    System.out.println(message);
  }
}

public class MainClass {
  public static void main(final String[] args) throws Exception {

    Class<A> aClass = (Class<A>)Class.forName(args[0]);
    // what's next in order to something like this even though
    // I don't know what subclass of A was passed in as an
    // argument above 
    A a = aClass.newInstance()
    {
      public void initialize() {
        this.message = args[1];
      }
    };
  }
}

我可能最终会使用方面,但我想知道是否有纯 Java 方式。

4

3 回答 3

1

你的意思是这样的假设它会编译(它不会):

@Override
A a = aClass.newInstance()
{
  public void initialize() {
        this.message = args[1];
      }
};
于 2011-02-24T03:37:36.030 回答
1

您正在尝试做的将需要创建一个新的匿名内部类,它是您仅在运行时才知道的某个类的子类。反射不能解决这个问题。

动态代理可能...如果您尝试实现动态加载的接口。

我能想到的唯一其他方法是使用 BCEL 或动态源代码生成/编译。两者都将非常复杂。也不算是纯Java。

我的建议是重新审视你想要实现的目标。(您的问题没有暗示可能是什么,因此很难提供任何实用的建议。)

于 2011-02-24T06:21:31.297 回答
1

听起来您想要的是Dynamic Proxies,它从 Java 1.3 开始就可用。

编辑: 我研究了mockito,看看他们如何设法模拟具体的类,结果他们创建了字节码,然后用类加载器加载它。这不仅不能真正得到你想要的,而且比它需要的更复杂。

我同意 Stephen C:你为什么要这样做?我怀疑可能有更简单的方法。我怀疑对您更有效的是策略命令模式。在这种情况下,自定义代码在它自己的小类中:

public class Initializer<A> {

  public (abstract) void initialize(A parent);
}

final String args[] = ...;
Initializer<A> initializer = new Initializer<A>() {
  public void initialize(A parent) {
      parent.setMessage(args);
  }
};

它要么分配给主类,要么包装主类(取决于需要)。

于 2011-02-24T03:50:40.233 回答