3

リフレクションを使用して、特定のクラスからすべてのメソッドを取得しています。

このクラスには、クラスパスにないクラスへの参照があるため、例外が発生します。

java.lang.NoClassDefFoundError:

これについて:

Method methods[] = theClass.getDeclaredMethods();

どういうわけか、クラスパスにないものをすべて「スキップ」することは可能ですか?

4

1 に答える 1

0

Class.forName()は、クラスパスにあるかどうかに関係なく、クラスをロードしません。すでにロードされているクラスへのハンドルのみを返します。

クラスは、主に次の2つの方法のいずれかで読み込まれます。

1.)クラスはインポートステートメントで参照されます(java.lang。*は自動的にインポートされるため、java.langパッケージのすべてのクラスは最初からクラスロードされます)

2.)ClassLoaderからの呼び出しを使用してクラスがロードされます。この場合、その依存関係はすべて解決されます。と同様にロード

したがって、クラスパスの外部、またはクラスパスの外部に依存関係があるクラスをロードしようとしている場合は、ClassLoaderをサブクラス化し、クラスとその依存関係をロードする方法を指示する必要があります。

ここでClassLoaderの仕様を参照してください:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html

また、ClassLoaderインスタンスをパスにポイントし、そのパスに任意のクラスをロードできるURL ClassLoaderなど、必要な処理を実行できるClassLoaderの既製のサブクラスがあります。

于 2012-11-14T11:30:20.297 に答える