2012-02-19 6 views
1

ロードする必要がある特定のクラスがあります。名前はString配列に格納されます。私は特定のクラスを読み込むことができますが、私はproprelyを操作することはできません。java文字列からクラスをロードする

String [] myClassesList = {"Class1", "Class2", "Class3"...}; 
FileClassLoader loader = new FileClassLoader("MyClassesPath"); 

Class [] c = new java.lang.Class[myClassesList.length]; 

for(int i=0; i<myClassesList.length; i++){ 
    c[i]=loader.loadClass (myClassesList[i]); 
    ... //This work proprely 
} 

が、私は

c[i] myNewCi = new c[i].<constructor>(); 

することはできません:すべての私のクラスはJPanelのを延長しています。 jTabbedPaneに追加する必要があります。私は次のコードを実行しようとしています。

... 
    myPanelClass myPanel = new myPanelClass(); 
    jTabbedPane1.addTab("myPanelName", myPanel); 
... //This work proprely 

フィードバックは役に立ちます。ありがとう!

+0

I [i]が.getConstructor(....)のnewInstance(....)Cを追加することはできませんJavaの命名規則を学び、それらに – kleopatra

答えて

2

JPanelを拡張してタブに追加できるようにするだけであれば、次のことを試してください。

Class<? extends JPanel> c = Class.forName(myClassesList[i]).asSubclass(JPanel.class); 
JPanel panel = c.newInstance(); 
jTabbedPane1.addTab(panel); 

これはJPanelのを拡張(リフレクションを使用して)新しいクラスを作成しますが、あなたはそれを型キャストしない限り、あなたは、その機能に制限されます。

あなたがあなたのクラス(他のメソッドなどを呼び出す)ともっとやりとりする必要があり、型キャストしたくない場合は、クラスのコントラクトを定義する必要があります。これは、クラス間に抽象クラスを追加し、抽象クラスをJPanelに拡張することを意味します。ここに例があります。

抽象クラスを定義します。これはあなたのクラスにしたい余分なメソッド名を持つことになります

public abstract class ATest extends JPanel{ 
    public abstract String doSomething(); 
} 

次に、あなたの具象クラスを実装する必要が

public class Class1 extends ATest{ 
    public Class1(){ 
     //init me 
    } 

    @Override 
    public String doSomething() { 
     return "Class 2"; 
    } 
} 

あなたがクラスを初期化し、リフレクションを使用してください何をして無料になります

Class<? extends ATest> c = Class.forName(myClassesList[i]).asSubclass(ATest.class); 
ATest panel = c.newInstance(); 

System.out.println(panel.doSomething()); 
jTabbedPane1.addTab(panel); 
0

クラスオブジェクトnewを呼び出すことはできません。クラスを定義しているコードに表示されているように、クラス自体でのみ名前で呼び出すことができます。このようにクラスにアクセスできない場合は、リフレクションを使用する必要があります。参考

class MyClass ... 

newでインスタンス化することができるが、:

MyClass.class 

は、そのクラスを表すオブジェクトであり、そして新しいでインスタンス化することができません。あなたの場合、これは:

MyClass.class.newInstance(); 

で十分です。

1

あなたはおそらくのような何かをしたいと思う:....は、関連するコンストラクタパラメータを含む

c[i].getConstructor(....).newInstance(....); 

+0

を貼り付けてください。 jTabbedPane1.addTab( "myPanelName"、<<>); – marcb