JAVAの反射メカニズム=>反射分析クラスでの実現


反射の概念:具体的なクラスの能力を分析できるプログラムを反射と呼ぶ
(JAVA           ,       ,                ;        ,             ;                         java       。)

反射メカニズムの役割:
    1、            
    2、        

1、反射メカニズム==>クラスの構造を検査する:
予備知識:java.lang.reflectパッケージには、クラスのドメイン(プロパティ/フィールド)、メソッド、コンストラクタを記述するために使用される3つのクラスField、Method、Constructorがあります.
1、反射分析クラスの能力(コードで実現)
package     ;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
/**
 *           
 */
public class ReflectionTest {

    public static void main(String[] args) {
        //              
        String name;
        if(args.length>0) name=args[0];
        else{
            Scanner in=new Scanner(System.in);
            System.out.println("      (  :java.util.Date):");
            name=in.next();
        }

        try {
            //        Class  
            Class cl=Class.forName(name);
            Class supercl=cl.getSuperclass();
            //      
            String modifiers=Modifier.toString(cl.getModifiers());
            if(modifiers.length()>0)
                System.out.print(modifiers+" ");
            System.out.print("calss "+name);
            if(supercl!=null&&supercl!=Object.class)
                System.out.print(" extends "+supercl.getName());
            System.out.print("{
"
); printConstructors(cl); System.out.println(); printMethods(cl); System.out.println(); printFields(cl); System.out.println("}"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * */ public static void printConstructors(Class cl){ // Constructor[] constructors=cl.getDeclaredConstructors(); for(Constructor c:constructors){ String name=c.getName(); System.out.print(" "); // , public static int mod=c.getModifiers(); // String modifiers=Modifier.toString(mod); if(modifiers.length()>0) System.out.print(modifiers+' '); System.out.print(name+'('); // Class[] paramTypes=c.getParameterTypes(); for(int j=0;jif(j>0) System.out.print(", "); System.out.print(paramTypes[j].getName()); } System.out.println(");"); } } /** * * @param cl */ public static void printMethods(Class cl){ Method[] methods=cl.getDeclaredMethods(); for(Method m:methods){ Class retType=m.getReturnType(); String name=m.getName(); System.out.print(" "); // 、 、 String modifiers=Modifier.toString(m.getModifiers()); if(modifiers.length()>0) System.out.print(modifiers+' '); System.out.print(retType.getName()+" "+name+"("); // Class[] paramTypes=m.getParameterTypes(); for(int j=0;jif(j>0) System.out.print(", "); System.out.print(paramTypes[j].getName()); } System.out.println(");"); } } /** * ( ) * @param cl */ public static void printFields(Class cl){ Field[] fields=cl.getDeclaredFields(); for(Field f:fields){ // Class type=f.getType(); String name=f.getName(); System.out.print(" "); String modifiers=Modifier.toString(f.getModifiers()); if(modifiers.length()>0) System.out.print(modifiers+' '); System.out.println(type.getName()+" "+name+";"); } } }

出力結果:
      (  :java.util.Date):
java.util.Date
public calss java.util.Date{
    public java.util.Date(int, int, int, int, int, int);
    public java.util.Date(java.lang.String);
    public java.util.Date();
    public java.util.Date(long);
    public java.util.Date(int, int, int);
    public java.util.Date(int, int, int, int, int);

    public boolean after(java.util.Date);
    public boolean before(java.util.Date);
    public boolean equals(java.lang.Object);
    public java.lang.String toString();
    public int hashCode();
    public java.lang.Object clone();
    public int compareTo(java.util.Date);
    public volatile int compareTo(java.lang.Object);
    private void readObject(java.io.ObjectInputStream);
    private void writeObject(java.io.ObjectOutputStream);
    private final sun.util.calendar.BaseCalendar$Date normalize(sun.util.calendar.BaseCalendar$Date);
    private final sun.util.calendar.BaseCalendar$Date normalize();
    public static long parse(java.lang.String);
    public int getDate();
    public static java.util.Date from(java.time.Instant);
    public long getTime();
    private static final java.lang.StringBuilder convertToAbbr(java.lang.StringBuilder, java.lang.String);
    private final sun.util.calendar.BaseCalendar$Date getCalendarDate();
    private static final sun.util.calendar.BaseCalendar getCalendarSystem(int);
    private static final sun.util.calendar.BaseCalendar getCalendarSystem(sun.util.calendar.BaseCalendar$Date);
    private static final sun.util.calendar.BaseCalendar getCalendarSystem(long);
    public int getDay();
    public int getHours();
    private static final synchronized sun.util.calendar.BaseCalendar getJulianCalendar();
    static final long getMillisOf(java.util.Date);
    public int getMinutes();
    public int getMonth();
    public int getSeconds();
    private final long getTimeImpl();
    public int getTimezoneOffset();
    public int getYear();
    public void setDate(int);
    public void setHours(int);
    public void setMinutes(int);
    public void setMonth(int);
    public void setSeconds(int);
    public void setYear(int);
    public java.lang.String toGMTString();
    public java.time.Instant toInstant();
    public java.lang.String toLocaleString();
    public void setTime(long);
    public static long UTC(int, int, int, int, int, int);

    private static final sun.util.calendar.BaseCalendar gcal;
    private static sun.util.calendar.BaseCalendar jcal;
    private transient long fastTime;
    private transient sun.util.calendar.BaseCalendar$Date cdate;
    private static int defaultCenturyStart;
    private static final long serialVersionUID;
    private static final [Ljava.lang.String; wtb;
    private static final [I ttb;
}


上記のコードは、実行中にクラスのコンストラクタ、メソッド、ドメインをそれぞれ分析します.