Javaのようなものを持っている:
class A {}
class B {private A a;}
class C {private A a;}
を宣言したクラスがどれであるかをどうやって知ることができますか?
つまり、クラスBまたはクラスCを取得したい
どんなアイデアでも大歓迎です。
よろしく
指定した構造だけではできませんでした。B
またはのインスタンスへの参照を渡してから、C
渡さA
れた型を決定するロジックを記述する必要があります。
質問を理解しているので、コード内のクラス A (タイプの使用法) のすべての使用法を見つける必要があります (間違っている場合は修正してください)。
IDE とコード インスペクション用にインストールされているプラグインに依存します。ほとんどの IDE はそのような機能を提供します。たとえば、Eclipse では、クラスを右クリックして [参照] -> [プロジェクト] を選択できます。
IDE にこれがない場合は、Java 用のツールがたくさんあります。次を参照してください。
次のようなことをしなければなりません:
class A {
boolean itWasC;
public A( C objectC ) {
itWasC = true;
}
public A( B objectB ) {
itWasC = false;
}
}
そして、コンストラクターからクラス「A」のオブジェクトを作成するclass B
か、コンストラクターにclass C
渡します。this
例:A objectA = new A( this )
それは奇妙で、オブジェクトをインスタンス化せずに行うことはできません。
class A {
public void print(){
String className = new Exception().getStackTrace()[1].getClassName();
System.out.println(className);
}
}
class A1 {
private A a;
public A1(){
a= new A();
a.print();
}
}
class A2 {
private A a;
public A2(){
a= new A();
a.print();
}
}
public class C {
public static void main(String[] args) {
A1 a1= new A1();
A2 a2 = new A2();
}
}
クラスAのオブジェクトの参照がない限り、Javaでそれを行うことはできません...間違いなく、プログラムでも実行時でもありません。
ただし、 Class A を参照しているクラスを見つけたいだけの場合、1 つのオプションは、クラスの名前を別の名前に変更してコンパイルを試みることです。
そして出来上がり、コンパイラは Class A を参照するすべてのクラスをリストしますが、型に解決することはできません。
別の方法として、リフレクションを使用してクラス内の変数を見つけ、変数の型がクラス A 型であるかどうかを比較することもできます。
これを行うために私が書いたサンプルプログラムを次に示します
java.lang.reflect.Field をインポートします。
com.test.ClassA をインポートします。
package com.test;
public class ClassA {
}
public class ClassB {
private ClassA classA;
public static void main(String[] args) throws Exception,
NoSuchFieldException {
Field classVariable = ClassB.class
.getDeclaredField("classA");
classVariable.setAccessible(true);
System.out.println(classVariable.getType());
System.out.println(ClassA.class);
if (ClassA.class.equals(classVariable.getType())) {
System.out.println("Class A is referenced");
}
}
}
結果
class com.test.ClassA
class com.test.ClassA
Class A is referenced