1

java - 如何在运行时在java中动态创建接口的实现?

我有一个工厂,它将读取类 Foo 的注释并创建类 Bar 的实例。为了使这个工厂类型安全,我希望我的客户工厂成为与工厂方法的接口,该工厂方法采用 Foo 类型并返回 Bar 类型。然后我希望我的工厂在运行时实现这个工厂方法。

所有这一切都是因为工厂代码是多余的并且难以维护。如果在运行时生成,它将始终是最新的。

例子:

public class Foo{
    private String name;

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }
}

public class Bar{
    private String personName;

    public String getPersonName(){
        return personName;
    }

    public void setPersonName(String personName){
        this.personName= personName;
    }
}

public interface BarFactory{
    Bar create(Foo foo);
}

有没有办法做到这一点?

4

3 回答 3

1

如果您只想创建一些实现所需接口的实例 - 您可以简单地执行以下操作:

public <T> T newInstance (Class<T> type) {
    try {
        return type.newInstance();
    } catch (Exception ex) {
        try {
            // Try a private constructor.
            Constructor<T> constructor = type.getDeclaredConstructor();
            constructor.setAccessible(true);
            return constructor.newInstance();
        } catch (SecurityException ignored) {
        } catch (NoSuchMethodException ignored) {
            if (type.isMemberClass() && !Modifier.isStatic(type.getModifiers()))
                throw new SerializationException("Class cannot be created (non-static member class): " + type.getName(), ex);
            else
                throw new SerializationException("Class cannot be created (missing no-arg constructor): " + type.getName(), ex);
        } catch (Exception privateConstructorException) {
            ex = privateConstructorException;
        }
        throw new SerializationException("Error constructing instance of class: " + type.getName(), ex);
    }
}

如果您需要创建一个完全动态的接口实现,那么您需要使用代理http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html

这是你要找的东西吗?

于 2012-07-31T12:07:38.300 回答
1

使用 Java 代理反射。请参阅此处的示例:http: //docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html

于 2012-07-31T12:12:54.730 回答
0

通常,由于 Java 不是动态语言,因此动态创建代码不是受支持的语言功能。然而,有不同的字节码生成器可以帮助你。也许首先看一下Janino,它是一个小型 Java 内存编译器,它将在运行时从代码块创建可执行字节码。不知道这是否会解决您的问题,因为我不完全了解要求。

于 2012-07-31T12:07:10.463 回答