2

Java関連の質問があります:

変数を使用して(プログラム内で)クラスへのパスを作成する方法があることを知りたいです。特定のサイトから写真をダウンロードしてユーザーに表示するプログラムを作成しています。ただし、サイトによって形式が異なるため、それぞれに固有の一連の関数を定義する必要があります。(別のサイトのためだけに)同じジョブを実行する関数は同じ名前を持っている必要があるため、これらを同じクラスに入れることはできません。後で別のサイトのサポートをできるだけ簡単に追加できるようにしようとしています。

とにかく、問題は、変数を使用してプログラム内の関数を呼び出して、その場所を判別できるかどうかです。

例えば:code.picturesite.functionINeed();

codeはすべてのコーディングを含むパッケージでありpicturesite、クラスではなく、目的のクラスの名前を含む変数です。このように、変数の値を変更して別の関数(または別のクラスの同じ関数を呼び出すことしかできません) )。

私はそれが可能であるとは本当に期待していません(これはあなたが問題の性質を理解するためのものでした)が、私がここで達成しようとしていることを行う別の方法はありますか?

4

3 に答える 3

2

はい、方法があります。それは反射と呼ばれます。

クラス名を含む文字列を指定すると、次のようなインスタンスを取得できます。

Class<?> c = Class.forName("com.foo.SomeClass");
Object o = c.newInstance(); // assuming there's a default constructor

デフォルトのコンストラクターがない場合は、次の方法でコンストラクターへの参照を取得できます。c.getConstructor(param1.getClass(), param2.getClass(), etc)

メソッド名とインスタンスを含む文字列を指定すると、次のようにそのメソッドを呼び出すことができます。

Method m = o.getClass().getMethod("someMethod", param1.getClass(), param2.getClass(), etc);
Object result = m.invoke(o, param1, param2, etc);
于 2012-06-01T12:54:50.733 に答える
2

クラス名を含む変数を使用する代わりに、そのクラスのインスタンスを含む変数を使用する代わりに、クラスの関数を呼び出すことで解決できない質問がすぐには表示されません。それがその関数を実装していることを知るために、あなたはその関数をインターフェースに置くことができます。

interface SiteThatCanFoo {
    void foo();
}

class SiteA extends Site implements SiteThatCanFoo {
    public void foo() {
        System.out.println("Foo");
    }
}

それで:

Site currentSite = getCurrentSite(); // or getSiteObjectForName(siteName), or similar
if (SiteThatCanFoo.isAssignableFrom(currentSite.class)) {
    ((SiteThatCanFoo)currentSite).foo();
}
于 2012-06-01T13:15:09.203 に答える
1

だからあなたはこのようなことをしたい(ImageDownloader.getImageFromメソッドをチェックする)

class SiteADownloader {
    public static Image getImage(URI uri) {
        System.out.println("invoking SiteADownloader on "+uri);
        Image i = null;
        // logic for dowlnoading image from siteA
        return i;
    }
}

class SiteBDownloader {
    public static Image getImage(URI uri) {
        System.out.println("invoking SiteBDownloader on "+uri);
        Image i = null;
        // logic for dowlnoading image from siteB
        return i;
    }
}

// MAIN CLASS
class ImageDownloader {
    public static Image getImageFrom(String serverName, URI uri) {
        Image i = null;
        try {
            // load class
            Class<?> c = Class.forName(serverName + "Downloader");
            // find method to dowload img
            Method m = c.getDeclaredMethod("getImage", URI.class);
            // invoke method and store result (method should be invoked on
            // object, in case of static methods they are invoked on class
            // object stored earlier in c reference
            i = (Image) m.invoke(c, uri);
        } catch (NoSuchMethodException | SecurityException
                | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return i;
    }

    // time for test
    public static void main(String[] args) {
        try {
            Image img = ImageDownloader.getImageFrom("SiteB", new URI(
                    "adress"));
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }
}
于 2012-06-01T13:42:21.443 に答える