是否可以在使用反射时创建匿名类?

时间:2011-02-24 03:24:26

标签: java reflection anonymous-class

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

以下是一个例子:

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方式。

3 个答案:

答案 0 :(得分:1)

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

@Override
A a = aClass.newInstance()
{
  public void initialize() {
        this.message = args[1];
      }
};

答案 1 :(得分:1)

听起来你想要的是Dynamic Proxies,它自Java 1.3以来就已经可用。

编辑:我查看了mockito以了解他们是如何设法模拟具体类的,结果发现他们创建了字节代码,然后使用类加载器加载它。这不仅没有真正得到你想要的东西,而且比它更复杂。

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

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);
  }
};

分配给主类或包装主类(根据需要)。

答案 2 :(得分:1)

您要做的是创建一个新的匿名内部类,它是您在运行时只知道的某个类的子类。反思无法解决这个问题。

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

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

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