ゲッターとセッターを既存のクラスに動的に追加するにはどうすればよいですか?さらに使用するために、同じクラスのインスタンスを作成する必要があります。コンパイル時にPojoクラスを使用します。実行時にプロパティファイルを読み取り、それらのエンティティのゲッターとセッターを作成する必要があります
5 に答える
Javaには、まったく新しいメソッドを追加するための組み込みの手段がありません。組み込みスクリプトエンジン(http://docs.oracle.com/javase/6/docs/api/javax/script/package-summary.html)を試してから、Javascript、jRuby、Groovyなどを使用できます。これらの言語必要なものに沿ってより多くのランタイム機能を使用できるようになり、JavaScriptコードと対話できるようになります。
編集に基づいて、Map<String, String>
実行時に新しいプロパティ/値をロードするためにPOJO内にある方が良いでしょう:
public class SomePojo {
private int intAttribute;
private String stringAttribute;
private Map<String, String> dynamicProperties = new HashMap<String, String>();
//getters and setters...
}
public class BLClass {
public static void loadProperties(Properties properties, SomePojo pojo) {
Enumeration<?> enumeration = properties.propertyNames();
while (enumeration.hasMoreElements()) {
String key = (String) enumeration.nextElement();
String value = properties.getProperty(key);
pojo.getDynamicProperties().put(key, value);
}
}
}
そのラッパーを作成できます。
public class MyWrapper extends TheClass {
private TheClass theClass;
//getter/setters
}
これを行うことができます。通常、ORMツールは同様のことを行います。これは、バイトコードウィービング/バイトコードエンハンスメントと呼ばれます。BCELなどのサードパーティのバイトコードエンジニアリングライブラリを使用してこれを実現できます。
グーグルを試してみてください、ここにあなたにトピックに関するより多くの洞察を与えるであろういくつかのリンクがあります。
クラスを動的に変更することは許可されていないため、述べられているように不可能です。
代わりに使用できる既存のクラスにインターフェイスがある場合は、Java の動的プロキシ サポートを使用してゲッターとセッターを追加できます。
private static class InstanceProxy implements InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String methodName = method.getName();
// Do logic based on method name
}
}
でプロキシを作成しjava.lang.reflect.Proxy.newProxyInstance
ます。
これらのプロキシ オブジェクトには、呼び出されたメソッドの特定のインターフェイスと動的ロジックがあります。