JAvaプログラミング思想読書ノート(七)タイプ情報


ある冬休みあるいは1つの楽しい春節が過ぎて、自然は楽で、今やはり私の読書を続けます.これらの日を止めて、再び読み直す时に多くの収获があって、本は时には缲り返し読む必要があります;しかし、この本は一つの言語のシステム的な角度から上から下へ展開されていないような気がします.理解の難しさからJavaの中の多くの細部をわかりやすく話しています.個人的には言語設計を理解する能力にはあまりメリットがないような気がしますが、より多くの破片を蓄積しているだけで、実際に使っているのに大きな指導的な意味があります.やはり感慨はありません.ここでは文字列の章をスキップして、主にStringBuilder類と正規表現を強調しています(c#のは使ったことがありますが、これは使ったときに見ましょう(例では簡単に使っています)、それらの方法名は自分でも覚えられません.道理はそれほど悪くないはずです).
1.この章では、主にランタイムタイプ情報の取得と使用について説明します.
(1)Classオブジェクト
「Javaでは、すべてのタイプの変換が実行時に正確性チェックされます.」「クラスごとに1つのクラスオブジェクト(同じ名前の.classファイルに保存されている)が存在する」ため、クラス(すべてのクラスオブジェクトがこのクラスに属している)のいくつかの方法によって、必要なクラスのクラスオブジェクト(Class.forName()メソッドなど)を動的に取得し、そのクラスの情報を文字列形式のクラス名で取得することができます.あるいはnewInstance()法によってオブジェクトの構築を実現することができる.ここでclassオブジェクトの取得は,クラスがロードされると同時にstatic文が実行されるが,単純にクラスstatic final値(コンパイル期間定数)への参照はstatic初期化を起こさず,間接的にコンストラクタが暗黙的に静的であることを説明していると言える.
クラス字面定数:もう一つの生成classオブジェクト参照はクラス名である.classの形式では、classオブジェクトは自動的に初期化されません.「クラス参照は常にクラスのインスタンスを作成し、これらのインスタンスに作用するすべてのメソッドコードを含むクラスオブジェクトを指します」.クラスをより十分に利用するには、クラス参照を汎化することによって「?」を使用します.ワイルドカードやextends、superなどのキーワードは、classクラス参照を無限または制限的に使用するために使用されます.
(2)タイプチェック
xinstanceof Dogのようなキーワードinstanceofは、オブジェクトが特定のタイプであるかどうかを検出するブール値を返します.もう一つの方法はClassですisInstance()は、オブジェクトタイプを動的に検出できます.ここで注意したいのは、instanceofまたはisInstance()メソッドを使用してオブジェクトを検出する場合、「このクラスまたはこのクラスの派生クラス」をチェックするタイプの概念を維持し、「==」を使用して取得したclassオブジェクト参照と比較すると正確なタイプの比較にすぎないことです.
はんしゃ
比較的良い概念の文字を探し当てていないで、しかしこのように理解するのはやはりできて、JAVAの反射のメカニズムは運行の状態の中で、いずれの1つのクラスに対して、すべてこのクラスのすべての属性と方法を知ることができます;いずれのオブジェクトに対しても、そのメソッドとプロパティを呼び出すことができます.このような動的に取得された情報および動的にオブジェクトを呼び出す方法の機能をjava言語の反射メカニズムと呼ぶ.ここでは、2つの問題が発生する:1つは、実行中に動的にタイプ情報を取得することであり、RTTIも可能であるが、これはコンパイル時にオンとチェックである.classファイルで、反射メカニズムは実行時にタイプ情報を取得します(これはまだ分かりません、mark).もう1つの問題は、クラスやオブジェクトのすべての属性やメソッドを取得する以上、privateなどの修飾が隠されているプライベート情報も取得できることです.ここでは、このクラスのメソッドやプロパティ名を知る前提が必要です(java逆コンパイルツールで取得できるので、確かに可能ですが、推奨しません).
Classクラスとjava.lang.reflectクラスライブラリは、Field、Method、Constructorクラスを含む反射メカニズムをサポートします.本の例を見ることができます(属性取得を追加しました):
package com.test.myjava;
 /*
  * @author w7849516230
  */
import java.lang.reflect.*;
import java.util.regex.*;

/*   :          public     、  (      ),
 *         ,                   
 *   : eclipse    ,         ;   console  ,      
 */
public class ShowClassInformation {
	private static String usage = 
		"usage:
" + "ShowMethods qualified.class.name
" + "To Show all methods in class or:
" + "ShowMethods qualified.class.name word
" + "To Search for methods involving 'word'"; public String str = "public string"; private static Pattern p = Pattern.compile("\\w+\\."); // , //private static Pattern p = Pattern.compile("\\W+\\."); public static void main(String[] args){ if(args.length < 1){ System.out.print(usage); System.exit(0); } int lines = 0; try{ Class<?> c = Class.forName(args[0]); // try catch //Class<?> c = ShowClassInformation.class Method[] methods = c.getMethods(); Constructor[] ctors = c.getConstructors(); Field[] fields = c.getFields(); /* setXXX * Invoke */ if(args.length == 1){ System.out.println(args[0]+" Methods:"); for(Method method : methods) System.out.println(p.matcher(method.toString()).replaceAll("")); System.out.println(); System.out.println(args[0]+" Constructors:"); for(Constructor ctor : ctors) System.out.println(p.matcher(ctor.toString()).replaceAll("")); System.out.println(); System.out.println(args[0]+" Fields:"); for(Field field : fields) System.out.println(p.matcher(field.toString()).replaceAll("")); System.out.println(); lines = methods.length + ctors.length + fields.length; }else { for(Method method : methods) if(method.toString().indexOf(args[1]) != -1){ System.out.println(p.matcher(method.toString()).replaceAll("")); lines++; } for(Constructor ctor : ctors) if(ctor.toString().indexOf(args[1]) != -1){ System.out.println(p.matcher(ctor.toString()).replaceAll("")); lines++; } for(Field field : fields) if(field.toString().indexOf(args[1]) != -1){ System.out.println(p.matcher(field.toString()).replaceAll("")); } } }catch(ClassNotFoundException e){ System.out.println("No such class:" + e); } } }
     :java.lang.reflect.Method
   :java.lang.reflect.Method Methods:
public int hashCode()
public int getModifiers()
public transient Object invoke(Object,Object[]) throws IllegalAccessException,IllegalArgumentException,InvocationTargetException
public boolean equals(Object)
public String getName()
public String toString()
public Annotation getAnnotation(Class)
public Annotation[] getDeclaredAnnotations()
public Class getDeclaringClass()
public Class[] getParameterTypes()
public Class getReturnType()
public TypeVariable[] getTypeParameters()
public boolean isSynthetic()
public String toGenericString()
public Object getDefaultValue()
public Class[] getExceptionTypes()
public Type[] getGenericExceptionTypes()
public Type[] getGenericParameterTypes()
public Type getGenericReturnType()
public Annotation[][] getParameterAnnotations()
public boolean isBridge()
public boolean isVarArgs()
public Annotation[] getAnnotations()
public boolean isAnnotationPresent(Class)
public boolean isAccessible()
public static void setAccessible(AccessibleObject[],boolean) throws SecurityException
public void setAccessible(boolean) throws SecurityException
public final native Class getClass()
public final void wait() throws InterruptedException
public final void wait(long,int) throws InterruptedException
public final native void wait(long) throws InterruptedException
public final native void notify()
public final native void notifyAll()


java.lang.reflect.Method Constructors:


java.lang.reflect.Method Fields:
public static final int PUBLIC
public static final int DECLARED
反射メカニズムはまた、実行時に反射メカニズムによって取得されたタイプ情報に基づいて、被エージェントオブジェクトの属性メソッドを呼び出すことができる動的エージェントに条件を作った.Interface InvocationHandlerとクラスProxyを使用します.