0

誰かがこれについて私を案内してくれませんか。Javaリフレクションを使用してクラスをロードできるクラスローダーがあります。ただし、とにかくオブジェクトをインターフェイスにキャストできますか?あることは承知していますが、ServiceLoaderお勧めしません。

//returns a class which implements IBorrowable
public static IBorrowable getBorrowable1()  
{
    IBorrowable a;  //an interface
     try
        {
            ClassLoader myClassLoader = ClassLoader.getSystemClassLoader();
            a = (IBorrowable) myClassLoader.loadClass("entityclasses.Books");

        }
    catch (Exception e ){
        System.out.println("error");
    }
    return null;
}
4

2 に答える 2

1

ここで間違っていると思われる唯一のことは、システムクラスローダーを使用していることです。実装クラスが表示されない可能性があります。

public static IBorrowable getBorrowable1()  //returns a class which implements IBorrowable
{
    IBorrowable a;  //an interface
     try
        {
            a = (IBorrowable) Class.forName("entityclasses.Books");
        }
    catch (Exception e ){
        System.out.println("error");
    }
    return a;
}

余談ServiceLoaderですが、私は強くお勧めします。

于 2013-03-19T09:52:57.343 に答える
1

オブジェクトのインスタンス化が欠落しているようです。

myClassLoader.loadClass("entityclasses.Books")のインスタンスではなくIBorrowable、Books を参照する Class オブジェクトのインスタンスを返します。newInstance()メソッドを使用して、ロードされたクラスのインスタンスを作成する必要があります

ここに修正バージョンがあります(Booksデフォルトのコンストラクターがあると仮定します)

public static IBorrowable getBorrowable1()  //returns a class which implements IBorrowable
{
     try {
        ClassLoader myClassLoader = ClassLoader.getSystemClassLoader();
        Class<IBorrowable> clazz = (IBorrowable) myClassLoader.loadClass("entityclasses.Books");
        return clazz.newInstance();
    } catch (Exception e) {
        System.out.println("error");
    }
    return null;
}
于 2013-03-19T09:58:51.067 に答える