リフレクションを使用して動作する既存のコードがありますが、可能であれば依存性注入と Guice を使用してオブジェクトの作成を開始したいと考えています。
現在の仕組みは次のとおりです。
- 構成 (
.properties
) ファイルがロードされ、次のような文字列が含まれます。objects=Foo,^ab..$;Bar,^.bc.$;Baz,i*
- 注:
Foo
、Bar
、およびBaz
は実装するクラスです。MyInterface
- 各ペアには、ペアになっている正規表現があります。
- 入力データは別のソースから供給されます。この例を想像してみてください。データは次のとおりです。
String[]{ "abab", "abcd", "dbca", "fghi", "jklm" }
- 次に、Guice によって作成された
の新しいインスタンス
Foo
を作成したいと考えてBar
います。Baz
- この場合、作成されるインスタンスは次のようになります。
new Foo("abab");
new Foo("abcd");
new Bar("abcd");
new Bar("dbca");
new Baz("fghi");
"jklm"
一致するパターンがないため、新しいインスタンスは作成されません。
- この場合、作成されるインスタンスは次のようになります。
リフレクションを使用して、現在どのように機能するかを次に示します (これは、sscceごとに実行できる最善の方法です)。
public class MyInterfaceBuilder {
private Classloader tcl = Thread.currentThread().getContextClassLoader();
private Pattern p;
private Class<? extends MyInterface> klass;
public InterfaceBuilder(String className, String pattern) {
this.pattern = Pattern.compile(pattern);
this.klass = makeClass(className);
}
private static Class<? extends Interface> makeClass(String className) {
String fullClassName = classPrefix + className;
Class<?> myClass;
try {
myClass = tcl.loadClass(fullClassName);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("Class not found: " + fullClassName, e);
}
if(MyInterface.class.isAssignableFrom(myClass)) {
return (Class<? extends MyInterface>) myClass;
} else {
throw new IllegalArgumentException(fullClassName + " is not a MyInterface!");
}
}
public MyInterface makeInstance(String type) {
if (pattern == null || pattern.matcher(type).find()) {
MyInterface newInstance = null;
try {
newInstance = klass.getConstructor(String.class).newInstance(type);
} catch (Exception e) {
// Handle exceptions
}
return newInstance;
} else {
return null;
}
}
}
Guice を使用して、この機能 (実行時に動的にクラスをロードし、正確に一致するインスタンスを作成する) を複製するにはどうすればよいですか?