1

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

Javaプロキシリフレクションを使用します。こちらの例を参照してください:http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html

于 2012-07-31T12:12:54.730 に答える
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 に答える
0

一般に、Java は動的言語ではないため、動的にコードを作成する言語機能はサポートされていません。ただし、役立つ可能性のあるさまざまなバイトコード ジェネレーターが利用可能です。おそらく最初に、実行時にコードブロックから実行可能なバイトコードを作成する小さな Java メモリ内コンパイラであるJaninoを見てください。要件を完全に理解していないため、これで問題が解決するかどうかはわかりません。

于 2012-07-31T12:07:10.463 に答える