.getClass()と.classの違い
3937 ワード
ずっと考えてたclassと.getClass()の違いは、長い間考えていて、少し考えて、それからネットで検索して、次のような文章を見つけて、みんなと分かち合いました.
もともとjavaの反射にかかわる~~~~~~
Java反射学習
反射とは,実行時にオブジェクトタイプ情報を取得する操作と理解できる.従来のプログラミング方法では、プログラマがコンパイル段階で使用するタイプを決定する必要があるが、反射の助けの下で、プログラマはこれらの情報を動的に取得し、より移植性のあるコードを記述することができる.厳密には、反射はプログラミング言語の特性ではなく、どの言語でも反射メカニズムを実現できるためであるが、プログラミング言語自体が反射をサポートすれば、反射の実現が便利になる.
1,取得タイプクラス
Javaではすべてオブジェクトであることを知っています.一般的に使用しているオブジェクトはObjectクラスから直接または間接的に継承されています.ObjectクラスにはgetClassというメソッドが含まれており,このメソッドを用いてインスタンスのタイプクラスを得ることができる.タイプクラスとは、すべてがオブジェクトであり、タイプも例外ではないため、Javaでタイプクラスを使用してタイプを表すクラスを指します.すべてのタイプクラスはクラスクラスのインスタンスです.たとえば、次のコードがあります.
[java]
view plaincopyprint?
オブジェクトaはAのインスタンスであり、Aはクラスであり、if文でa.getClass()を使用して返される結果はAのタイプクラスであり、Javaでは特定のタイプのタイプクラスが「タイプ.class」で取得できることを示す.a.getClass()取得はAのタイプクラス、すなわちA.classであるため、したがって,上記のコード実行の結果,「equal」が印刷される.特に、タイプクラスは1つ1つ対応しており、親クラスのタイプクラスと子クラスのタイプクラスは異なるので、AがBの子クラスであると仮定すると、次のコードが「unequal」の出力を得ることになる.
[java]
view plaincopyprint?
したがって、インスタンスを知っている場合は、インスタンスの「getClass()」メソッドを使用してオブジェクトのタイプクラスを取得できます.タイプを知っている場合は、「.class」メソッドを使用してタイプクラスを取得できます.
2,取得タイプの情報
タイプクラスを取得すると、いくつかのメソッドを呼び出してタイプの情報を取得できます.主なメソッドは次のとおりです.
getName():String:このタイプのフルネームを取得します.
getSuperClass():Class:このタイプの直接親を取得し、そのタイプに直接親がない場合nullを返します.
getInterfaces():Class[]:このタイプの実装のすべてのインタフェースを取得します.
isArray():boolean:このタイプが配列であるかどうかを判断します.
isEnum():boolean:このタイプが列挙タイプかどうかを判断します.
isInterface():boolean:このタイプがインタフェースかどうかを判断します.
isPrimitive():boolean:このタイプが基本タイプかどうか、すなわちint、boolean、doubleなどを判断します.
isAssignableFrom(Classcls):boolean:このタイプがタイプclsの親(祖先)クラスまたは親(祖先)インタフェースであるかどうかを判断します.
getComponentType():Class:このタイプが配列である場合、その配列のコンポーネントタイプが返されます.
また、タイプ変換などの操作も可能です.主な方法は次のとおりです.
asSubclass(Class clazz):Class:このタイプを
-----------------------------------------------------------------------------------
反射を学ぶときにこの問題を思い出した.getClass()と.classには何か違いがありますか?もちろん、最も明らかな違いは.getClass()はオブジェクトインスタンスのメソッドであり、このメソッドはオブジェクトインスタンスのみであり、特定のクラスにはありません.クラスのクラスの例は.classが獲得したのは、明らかにクラスにはありません.getClass()メソッド.ネット上でまたいくつかのその他の資料を探し当てます:1、出現の時期は異なっています:Class.forName()は実行時にロードされます.Class.classとgetClass()は、コンパイラにロードする.classは静的ロードです.getClass()はダイナミックロードです.ここに疑問がありますか?Class.forName(「XXX」)この方法はclassを動的にロードし、クラスファイルをロードしてから使用します.新Instance()でオブジェクトが作成されました.
新ClassName()は、いわゆる静的ロード、Classです.forName(「ClassName」)は、いわゆるダイナミックロードです.違いは、「静的ロード」のクラスはコンパイル時に提供され、動的ロードのクラスはソースプログラムのコンパイル時に欠席することができます.
Class.forName(xxx.x.xx)はクラスを返します.新Instance()の後にオブジェクトClassが作成されます.forName(xxx.xx.xx);JVMが指定したクラスを検索してロードする必要があります.つまり、JVMはクラスの静的コードセグメントを実行します.
参考になる
http://www.blogjava.net/William/archive/2006/08/25/65804.html
2、例を挙げると、Iterator it=s.iterator();得られたitの真のタイプはKeyIteratorであり、Iteratorのサブクラスであり、一般的にはnext()メソッドを実行できるはずであるが、KeyIteratorはhashmapの内部クラスであり、JAVAが与えるヒントはcannot access a member of class javaであることに注目すべきである.util.HashMap$KeyIterator withmodifiers"public"は、上記の例からも分かるように、内部クラスを除く他のクラスの応用上である.class機能は完全に等しい.getClass()!1つはクラスで直接取得され、1つはインスタンスで取得されます.
もともとjavaの反射にかかわる~~~~~~
Java反射学習
反射とは,実行時にオブジェクトタイプ情報を取得する操作と理解できる.従来のプログラミング方法では、プログラマがコンパイル段階で使用するタイプを決定する必要があるが、反射の助けの下で、プログラマはこれらの情報を動的に取得し、より移植性のあるコードを記述することができる.厳密には、反射はプログラミング言語の特性ではなく、どの言語でも反射メカニズムを実現できるためであるが、プログラミング言語自体が反射をサポートすれば、反射の実現が便利になる.
1,取得タイプクラス
Javaではすべてオブジェクトであることを知っています.一般的に使用しているオブジェクトはObjectクラスから直接または間接的に継承されています.ObjectクラスにはgetClassというメソッドが含まれており,このメソッドを用いてインスタンスのタイプクラスを得ることができる.タイプクラスとは、すべてがオブジェクトであり、タイプも例外ではないため、Javaでタイプクラスを使用してタイプを表すクラスを指します.すべてのタイプクラスはクラスクラスのインスタンスです.たとえば、次のコードがあります.
[java]
view plaincopyprint?
A a = new A();
if(a.getClass()==A.class) {
System.out.println("equal");
} else {
System.out.println("unequal");
}
equal;
オブジェクトaはAのインスタンスであり、Aはクラスであり、if文でa.getClass()を使用して返される結果はAのタイプクラスであり、Javaでは特定のタイプのタイプクラスが「タイプ.class」で取得できることを示す.a.getClass()取得はAのタイプクラス、すなわちA.classであるため、したがって,上記のコード実行の結果,「equal」が印刷される.特に、タイプクラスは1つ1つ対応しており、親クラスのタイプクラスと子クラスのタイプクラスは異なるので、AがBの子クラスであると仮定すると、次のコードが「unequal」の出力を得ることになる.
[java]
view plaincopyprint?
A a = new A();
if(a.getClass()==B.class) {
System.out.println("equal");
} else {
System.out.println("unequal");
}
unequal;
したがって、インスタンスを知っている場合は、インスタンスの「getClass()」メソッドを使用してオブジェクトのタイプクラスを取得できます.タイプを知っている場合は、「.class」メソッドを使用してタイプクラスを取得できます.
2,取得タイプの情報
タイプクラスを取得すると、いくつかのメソッドを呼び出してタイプの情報を取得できます.主なメソッドは次のとおりです.
getName():String:このタイプのフルネームを取得します.
getSuperClass():Class:このタイプの直接親を取得し、そのタイプに直接親がない場合nullを返します.
getInterfaces():Class[]:このタイプの実装のすべてのインタフェースを取得します.
isArray():boolean:このタイプが配列であるかどうかを判断します.
isEnum():boolean:このタイプが列挙タイプかどうかを判断します.
isInterface():boolean:このタイプがインタフェースかどうかを判断します.
isPrimitive():boolean:このタイプが基本タイプかどうか、すなわちint、boolean、doubleなどを判断します.
isAssignableFrom(Classcls):boolean:このタイプがタイプclsの親(祖先)クラスまたは親(祖先)インタフェースであるかどうかを判断します.
getComponentType():Class:このタイプが配列である場合、その配列のコンポーネントタイプが返されます.
また、タイプ変換などの操作も可能です.主な方法は次のとおりです.
asSubclass(Class clazz):Class:このタイプを
-----------------------------------------------------------------------------------
反射を学ぶときにこの問題を思い出した.getClass()と.classには何か違いがありますか?もちろん、最も明らかな違いは.getClass()はオブジェクトインスタンスのメソッドであり、このメソッドはオブジェクトインスタンスのみであり、特定のクラスにはありません.クラスのクラスの例は.classが獲得したのは、明らかにクラスにはありません.getClass()メソッド.ネット上でまたいくつかのその他の資料を探し当てます:1、出現の時期は異なっています:Class.forName()は実行時にロードされます.Class.classとgetClass()は、コンパイラにロードする.classは静的ロードです.getClass()はダイナミックロードです.ここに疑問がありますか?Class.forName(「XXX」)この方法はclassを動的にロードし、クラスファイルをロードしてから使用します.新Instance()でオブジェクトが作成されました.
新ClassName()は、いわゆる静的ロード、Classです.forName(「ClassName」)は、いわゆるダイナミックロードです.違いは、「静的ロード」のクラスはコンパイル時に提供され、動的ロードのクラスはソースプログラムのコンパイル時に欠席することができます.
Class.forName(xxx.x.xx)はクラスを返します.新Instance()の後にオブジェクトClassが作成されます.forName(xxx.xx.xx);JVMが指定したクラスを検索してロードする必要があります.つまり、JVMはクラスの静的コードセグメントを実行します.
参考になる
http://www.blogjava.net/William/archive/2006/08/25/65804.html
2、例を挙げると、Iterator it=s.iterator();得られたitの真のタイプはKeyIteratorであり、Iteratorのサブクラスであり、一般的にはnext()メソッドを実行できるはずであるが、KeyIteratorはhashmapの内部クラスであり、JAVAが与えるヒントはcannot access a member of class javaであることに注目すべきである.util.HashMap$KeyIterator withmodifiers"public"は、上記の例からも分かるように、内部クラスを除く他のクラスの応用上である.class機能は完全に等しい.getClass()!1つはクラスで直接取得され、1つはインスタンスで取得されます.