2012-03-29 12 views
1

まず、私が抽象クラスを持っていると仮定して、それをAbstractClassという名前にします。たとえば、あるクラスがあるとします。クラスAとしましょう。 ClassAはAbstractClassを拡張します。 ClassAはフォルダに保存されます。 (これは、クラスパスにロードする必要があります。)今 動的にロードされたクラスを参照してコンパイル

、私はプログラム内で新しいクラスを書いていること

ClassB 
を仮定し、私はClassBのはにClassAを参照できるようにしたいです。

public class ClassB extends AbstractClass { 

    ClassA A = new ClassA(); 

    public void F() { 
     A.F(); 
    } 

} 

の線に沿って何かが今、私はクラスAを取得し、動的にそれを使用するクラスローダを使用して何の問題もなかったしています。また、ユーザー入力に基づいてClassAのようなクラスを動的に作成し、プログラム内でコンパイルし(ecj.jarを使用して)、それをロードしてメソッドを呼び出しても問題はありませんでした。

私は現在、動的にロードされているクラスを、動的に作成してコンパイルしているクラスで参照する方法は分かりません。輸入等の書き方が分かりません。クラスAを入れて入れています

import classA;

にclassB.javaファイルへのトリックはありません。

これは私の最初の質問StackOverflow(長い時間の読者)ですので、私に簡単に行きます。前もって感謝します。

-

コンテキスト:ユーザーが入力した確率分布を使用するプログラム。私は抽象クラスAbstractDistributionを持っています。この抽象クラスは、ディストリビューションのCDF、PDF、逆CDFなどの抽象メソッドを持っています。これまでは、AbstractDistributionを拡張したコンパイルとロードを動的に記述し、newInstance()を取得し、他のクラス。しかし、Dist1を作成して動的にロードした場合、Dist1のPDFなどを呼び出すことができるDist2を作成したいと考えています。

+0

なぜクラスBはクラスAを拡張できませんか? – Jasonw

+0

@jasonw、上記の例は本当に削除された例です。私がClassA1とClassB1クラスを持っていたとしましょう。 'class ClassB { ClassA1 A1 = new ClassA1(); ClassA2 A2 =新しいClassA2(); public void F(){ A1.F(); A2。F(); } } ' – richard

+0

大丈夫リチャード、いくつかの教祖はここでいくつかの光を放つだろう、私は望みます:-) – Jasonw

答えて

2

Bが直接Aを参照してくださいしないでください - BAbstractClassを参照にし、そのコンストラクタでインスタンスへの参照を取る:

public class ClassB extends AbstractClass { 

    private final AbstractClass other; 

    public ClassB(AbstractClass other) { 
     this.other = other; 
    } 

    public void F() { 
     other.F(); 
    }  
} 

あなたが行っている方法を作業する必要がある。この時点では、 AbstractClassの別のインスタンス(それがClassAか何かであるかどうか)の参照を取得するが、それは直接の依存関係を取り除く。

もっと正確な詳細があると確信していますが、のように直接依存関係を壊すと、動的コンパイルの面で問題が少なくなります。

+0

ありがとう@JohnSkeet。これは、ユーザーがリファレンスでハードコードできるようにするため、私が探しているものではありません。つまり、JTextFieldsでは基本的に新しいメソッドの内容を定義して新しいクラスに書き出し、コンパイルします。例えば、 'ClassA'がすでに動的に記述されて読み込まれている場合、' new ClassA().F() 'のようなものを書き込んでコンパイルすることができます。これは不可能かもしれません。 : – richard

+0

@richard:コンパイル内で使用しているクラスパスに動的にコンパイルされたクラスを含めている限り、それはそうです。 –

+0

私はうまく動作しました。コンパイラのクラスパスについてです。 'JavaCompiler.getTask(...)'関数の 'options'引数に' -classpath [動的に記述されたクラスを持つディレクトリ] 'を渡すと**完全に**動作しました**私はユーザーが作成するかもしれないクロスクラスの依存関係を管理する悪夢に対処しなければなりません。 – richard

関連する問題