Java反射機構の詳細解_動力ノードJava学院の整理


Java反射メカニズムの紹介
Java反射機構通俗的に言えば、運行状態の中で、「類の部分がすでに持っている情報」によって、「類のすべての情報」を元に戻すことができます。ここで「クラスの部分が既に持っている情報」は、「クラス名」や「クラスの対象」などの情報とすることができます。クラスのすべての情報とは、「クラスの属性、方法、継承関係、Annotation注解」などの内容です。
簡単な例を挙げます。例えば、クラスReflectionTest.javaについて、私達が知っている唯一の情報はその類名です。「comp.bjpowernode.Reflection」です。この時、ReflectionTest.javaの他の情報(例えば、その構造関数、そのメンバー変数など)を知りたいですが、どうすればいいですか?
これは「反射」が必要です。反射によって,ReflectionTest.javaの完全な情報を解析でき,その構造関数,メンバー変数,継承関係などを含む。
「java反射機構」の概念を理解した後で、クラスの名前によって、クラスの完全な情報を得るにはどうすればいいですか?
このプロセスは主に二つのステップに分けられます。
ステップ1:クラス名によってクラスのクラスのオブジェクトを取得します。
第2ステップ:クラスオブジェクトの関数インターフェースを通して、「クラスの構造関数、メンバー変数」などの情報を読みだします。
以下では、例に従って、この概念の理解を深める。例は以下の通りです。

package com.bjpowernode.test;
import java.lang.Class;
public class Demo1 {
  public static void main(String[] args) {
    try {
      //   “  ”      Class  
      Class<?> cls = Class.forName("com.bjpowernode.test.Person");
      //     。newInstance()             
      Object obj = cls.newInstance();
      System.out.println("cls="+cls);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
class Person {
  public Person() {
    System.out.println("create Person");
  }
}
実行結果:

create Person
cls=class com.bjpowernode.test.Person
説明:
(01)Person類の完全パッケージ名は「comp.bjpowernode.test.Person」です。Class.forName(comp.bjpowernode.test.Person);この文の役割は、Personの名前に基づいてPersonのクラスのオブジェクトを取得することです。
(02)次に、ClassオブジェクトのnewInstance()を呼び出し、Personオブジェクトを作成します。
今は「java反射機構」の概念とその原理を知っています。この全体的な考えがあったら、次に反射について深く研究することができます。 
クラスの詳細
1クラスのオブジェクトを取得する方法
ここでは4つのよく使う「クラスのオブジェクトを獲得する」方法をまとめました。
方法1:クラス名.forName(「クラス名文字列」)
方法2:クラス名.クラス名
方法3:インスタンスオブジェクト.get Class()
方法4:「クラス名文字列」.getクラス()
以下では、この4つの方法を例示的に示します。例は以下の通りです。

package com.bjpowernode.test;
import java.lang.Class;
public class Demo2 {
  public static void main(String[] args) {
    try {
      //   1:Class.forName("     ") (  :          ,  +  )
      //Class cls1 = Class.forName("com.bjpowernode.test.Person");
      Class<?> cls1 = Class.forName("com.bjpowernode.test.Person");
      //Class<Person> cls1 = Class.forName("com.bjpowernode.test.Person");
      //   2:  .class
      Class cls2 = Person.class; 
      //   3:    .getClass()
      Person person = new Person();
      Class cls3 = person.getClass();
      //   4:"     ".getClass()
      String str = "com.bjpowernode.test.Person"; 
      Class cls4 = str.getClass();
      System.out.printf("cls1=%s, cls2=%s, cls3=%s, cls4=%s
", cls1, cls2, cls3, cls4); } catch (Exception e) { e.printStackTrace(); } } } class Person { public Person() { System.out.println("create Person"); } }
実行結果:

create Person
cls1=class com.bjpowernode.test.Person, cls2=class com.bjpowernode.test.Person, cls3=class com.bjpowernode.test.Person, cls4=class java.lang.String 
2クラスのAPI説明
クラスのすべてのAPIは以下の表の通りです。
  クラスのすべてのAPIは以下の表の通りです。

 public static Class  forName(String className)
 public static Class  forName(String name, boolean initialize, ClassLoader loader)
 public Constructor  getConstructor(Class[] parameterTypes)
 public Constructor[]  getConstructors()
 public Constructor  getDeclaredConstructor(Class[] parameterTypes)
 public Constructor[]  getDeclaredConstructors()
 public Constructor  getEnclosingConstructor()
 public Method  getMethod(String name, Class[] parameterTypes)
 public Method[]  getMethods()
 public Method  getDeclaredMethod(String name, Class[] parameterTypes)
 public Method[]  getDeclaredMethods()
 public Method  getEnclosingMethod()
 public Field  getField(String name)
 public Field[]  getFields()
 public Field  getDeclaredField(String name)
 public Field[]  getDeclaredFields()
 public Type[]  getGenericInterfaces()
 public Type  getGenericSuperclass()
 public Annotation<A>  getAnnotation(Class annotationClass)
 public Annotation[]  getAnnotations()
 public Annotation[]  getDeclaredAnnotations()
 public boolean  isAnnotation()
 public boolean  isAnnotationPresent(Class annotationClass)
 public boolean  isAnonymousClass()
 public boolean  isArray()
 public boolean  isAssignableFrom(Class cls)
 public boolean  desiredAssertionStatus()
 public Class<U>  asSubclass(Class clazz)
 public Class  getSuperclass()
 public Class  getComponentType()
 public Class  getDeclaringClass()
 public Class  getEnclosingClass()
 public Class[]  getClasses()
 public Class[]  getDeclaredClasses()
 public Class[]  getInterfaces()
 public boolean  isEnum()
 public boolean  isInstance(Object obj)
 public boolean  isInterface()
 public boolean  isLocalClass()
 public boolean  isMemberClass()
 public boolean  isPrimitive()
 public boolean  isSynthetic()
 public String  getSimpleName()
 public String  getName()
 public String  getCanonicalName()
 public String  toString()
 public ClassLoader  getClassLoader()
 public Package  getPackage()
 public int  getModifiers()
 public ProtectionDomain  getProtectionDomain()
 public URL  getResource(String name)
 public InputStream  getResourceAsStream(String name)
 public Object  cast(Object obj)
 public Object  newInstance()
 public Object[]  getSigners()
 public Object[]  getEnumConstants()
 public TypeVariable[]  getTypeParameters()
クラスの特性によって、クラスのクラスを4つの部分に分けて説明します。構造関数、メンバー方法、メンバー変数、クラスの他の情報(例えば、注釈、パッケージ名、クラス名、継承関係など)。
2.1コンストラクタ
「コンストラクション」関連API

//   “   parameterTypes” public     
public Constructor  getConstructor(Class[] parameterTypes)
//      public     
public Constructor[]  getConstructors()
//   “   parameterTypes” ,             ,  public、protected private  。
public Constructor  getDeclaredConstructor(Class[] parameterTypes)
//                ,  public、protected private  。
public Constructor[]  getDeclaredConstructors()
//       “             ”,  getEnclosingConstructor()            ;    ,  null。
public Constructor  getEnclosingConstructor()
次に、これらのAPIを例を通して説明する。コード例(DemoClass Contror.java)は以下の通りです。

package com.bjpowernode.test;
import java.lang.Class;
import java.lang.reflect.Constructor;
/**
 * java Class  Constructor  API     
 *
 * 
 */
public class DemoClassContructor {
  public static void main(String[] args) {
    // getDeclaredConstructor()      
    testGetDeclaredConstructor() ;
    // getConstructor()      
    testGetConstructor() ;
    // getEnclosingConstructor()      
    testGetEnclosingConstructor() ;
  }
  /**
   * getDeclaredConstructor()      
   */
  public static void testGetDeclaredConstructor() {
    try {
      //   Person  Class
      Class<?> cls = Class.forName("com.bjpowernode.test.Person");
      //   class,      
      Constructor cst1 = cls.getDeclaredConstructor();
      Constructor cst2 = cls.getDeclaredConstructor(new Class[]{String.class});
      Constructor cst3 = cls.getDeclaredConstructor(new Class[]{String.class, int.class, Gender.class});
      //       ,       
      cst1.setAccessible(true); //   Person Person() private ,           
      Object p1 = cst1.newInstance();
      Object p2 = cst2.newInstance("Juce");
      Object p3 = cst3.newInstance("Jody", 34, Gender.MALE);
      System.out.printf("%-30s: p1=%s, p2=%s, p3=%s
", "getConstructor()", p1, p2, p3); } catch (Exception e) { e.printStackTrace(); } } /** * getConstructor() */ public static void testGetConstructor() { try { // Person Class Class<?> cls = Class.forName("com.bjpowernode.test.Person"); // class, //Constructor cst1 = cls.getConstructor(); // , private 。 //Constructor cst2 = cls.getConstructor(new Class[]{String.class});// , protected 。 Constructor cst3 = cls.getConstructor(new Class[]{String.class, int.class, Gender.class}); // , //Object p1 = cst1.newInstance(); //cst1.setAccessible(true); // Person Person() private , //Object p1 = cst1.newInstance(); //Object p2 = cst2.newInstance("Kim"); Object p3 = cst3.newInstance("Katter", 36, Gender.MALE); System.out.printf("%-30s: p3=%s
", "getConstructor()", p3); } catch (Exception e) { e.printStackTrace(); } } /** * getEnclosingConstructor() */ public static void testGetEnclosingConstructor() { try { // Person Class Class<?> cls = Class.forName("com.bjpowernode.test.Person"); // class, Person InnerA Constructor cst = cls.getDeclaredConstructor(new Class[]{String.class, int.class}); // , Object obj = cst.newInstance("Ammy", 18); System.out.printf("%-30s: obj=%s
", "getEnclosingConstructor()", obj); } catch (Exception e) { e.printStackTrace(); } } } // 。 “ ” enum Gender{ MALE, FEMALE } // class Person { private Gender gender; // private int age; // private String name; // private Person() { this.name = "unknown"; this.age = 0; this.gender = Gender.FEMALE; System.out.println("call--\"private Person()\""); } protected Person(String name) { this.name = name; this.age = 0; this.gender = Gender.FEMALE; System.out.println("call--\"protected Person(String name)\""); } public Person(String name, int age, Gender gender) { this.name = name; this.age = age; this.gender = gender; System.out.println("call--\"public Person(String name, int age, Gender gender)\""); } public Person(String name, int age) { this.name = name; this.age = age; this.gender = Gender.FEMALE; // class InnerA{ } // InnerA Class Class cls = InnerA.class; // “ (InnerA)” Constructor cst = cls.getEnclosingConstructor(); System.out.println("call--\"public Person(String name, int age)\" cst="+cst); } @Override public String toString() { return "("+name+", "+age+", "+gender+")"; } }
注意:プログラムが実行できない場合は、「forName()」のパッケージ名が正しいか確認してください。forName()のパラメータは、Personクラスのフルネームでなければなりません。
実行結果:

call--"private Person()"
call--"protected Person(String name)"
call--"public Person(String name, int age, Gender gender)"
getConstructor() : p1=(unknown, 0, FEMALE), p2=(Juce, 0, FEMALE), p3=(Jody, 34, MALE)
call--"public Person(String name, int age, Gender gender)"
getConstructor() : p3=(Katter, 36, MALE)
call--"public Person(String name, int age)" cst=public com.bjpowernode.test.Person(java.lang.String,int)
getEnclosingConstructor() : obj=(Ammy, 18, FEMALE)
説明:
(01)まず、Person類をはっきりさせるべきです。それは私達がカスタマイズした種類です。これらのAPIをテストするために専用です。Personにはメンバー変数genderがあります。これはGenderオブジェクトで、Genderは列挙クラスです。取得値は、MALEまたはFEMALEとすることができる。
(02)testGetDeclardCostruct()は「get Declared Controuctor()のテスト関数」です。get DeclardContstructorは、「クラスの任意の構造関数を取得し、public、protected、prvate方法を含む」ことができます。
(03)testGetControuctor()は「get Controuctor()のテスト関数」です。get Constructor()は「クラス中のpublicの構造関数を取得することしかできません。」
(04)testGetEncocosingCostruct()は「get EncocopingCostructor()のテスト関数」です。get EclosingCostructorの紹介については、「このクラスのオブジェクトが構造方法のうちの1つのローカルまたは匿名クラスを表すと、Costructorのオブジェクトに戻ります。nullに戻ります。」分かりやすい点では、「Aクラスの構造関数に内部クラスのInneraAが定義されていると、InneralのClassオブジェクトを通じてget EclosingCostructor()方法を呼び出すと、クラスAのこの構造関数が得られる」ということです。
2.2メンバー方法
 “メンバー方法「関連API」

//   “   name,   parameterTypes” public   (        、        public  )
public Method  getMethod(String name, Class[] parameterTypes)
//      public   (        、        public  )
public Method[]  getMethods()
//   “   name,   parameterTypes”,           ,  public、protected private  。
public Method  getDeclaredMethod(String name, Class[] parameterTypes)
//              ,  public、protected private  。
public Method[]  getDeclaredMethods()
//       “            ”,  getEnclosingMethod()          ;    ,  null。
public Method  getEnclosingMethod()
次に、これらのAPIを例を通して説明する。コード例(DemoClass Method.java)は以下の通りです。

package com.bjpowernode.test;
import java.lang.Class;
import java.lang.reflect.Method;
/**
 * java Class  Method  API     
 *
 * 
 */
public class DemoClassMethod {
  public static void main(String[] args) {
      // getDeclaredMethod()      
      testGetDeclaredMethod() ;
      // getMethod()      
      testGetMethod() ;
      // getEnclosingMethod()      
      testGetEnclosingMethod() ;
  }
  /**
   * getDeclaredMethod()      
   */
  public static void testGetDeclaredMethod() {
    try {
      //   Person  Class
      Class<?> cls = Class.forName("com.bjpowernode.test.Person");
      //   class,          (    )
      Object person = cls.newInstance();
      //   Person    
      Method mSetName = cls.getDeclaredMethod("setName", new Class[]{String.class});
      Method mGetName = cls.getDeclaredMethod("getName", new Class[]{});
      Method mSetAge = cls.getDeclaredMethod("setAge", new Class[]{int.class});
      Method mGetAge = cls.getDeclaredMethod("getAge", new Class[]{});
      Method mSetGender = cls.getDeclaredMethod("setGender", new Class[]{Gender.class});
      Method mGetGender = cls.getDeclaredMethod("getGender", new Class[]{});
      //        
      mSetName.invoke(person, new Object[]{"Jimmy"});
      mSetAge.invoke(person, new Object[]{30});
      mSetGender.setAccessible(true);  //   Person setGender() private ,           
      mSetGender.invoke(person, new Object[]{Gender.MALE});
      String name = (String)mGetName.invoke(person, new Object[]{});
      Integer age = (Integer)mGetAge.invoke(person, new Object[]{});
      mGetGender.setAccessible(true);  //   Person getGender() private ,           
      Gender gender = (Gender)mGetGender.invoke(person, new Object[]{});
      //     
      System.out.printf("%-30s: person=%s, name=%s, age=%s, gender=%s
", "getDeclaredMethod()", person, name, age, gender); } catch (Exception e) { e.printStackTrace(); } } /** * getMethod() */ public static void testGetMethod() { try { // Person Class Class<?> cls = Class.forName("com.bjpowernode.test.Person"); // class, ( ) Object person = cls.newInstance(); // Person Method mSetName = cls.getMethod("setName", new Class[]{String.class}); Method mGetName = cls.getMethod("getName", new Class[]{}); //Method mSetAge = cls.getMethod("setAge", new Class[]{int.class}); // , setAge() protected 。 //Method mGetAge = cls.getMethod("getAge", new Class[]{}); // , getAge() protected 。 //Method mSetGender = cls.getMethod("setGender", new Class[]{Gender.class}); // , setGender() private 。 //Method mGetGender = cls.getMethod("getGender", new Class[]{}); // , getGender() private 。 // mSetName.invoke(person, new Object[]{"Phobe"}); //mSetAge.invoke(person, new Object[]{38}); //mSetGender.invoke(person, new Object[]{Gender.FEMALE}); String name = (String)mGetName.invoke(person, new Object[]{}); //Integer age = (Integer)mGetAge.invoke(person, new Object[]{}); //Gender gender = (Gender)mGetGender.invoke(person, new Object[]{}); // System.out.printf("%-30s: person=%s
", "getMethod()", person); } catch (Exception e) { e.printStackTrace(); } } /** * getEnclosingMethod() */ public static void testGetEnclosingMethod() { try { // Person Class Class<?> cls = Class.forName("com.bjpowernode.test.Person"); // class, ( ) Object person = cls.newInstance(); // class, Person InnerB Method mGetInner = cls.getDeclaredMethod("getInner", new Class[]{}); // , mGetInner.invoke(person, new Object[]{}); System.out.printf("%-30s: person=%s
", "getEnclosingMethod", person); } catch (Exception e) { e.printStackTrace(); } } } enum Gender{ MALE, FEMALE } class Person { private Gender gender; // private int age; // private String name; // public Person() { this("unknown", 0, Gender.FEMALE); } public Person(String name, int age, Gender gender) { this.name = name; this.age = age; this.gender = gender; } // ” “。 public public String getName() { return name; } // ” “。 public public void setName(String name) { this.name = name; } // ” “。 protected protected int getAge() { return age; } // ” “。 protected protected void setAge(int age) { this.age = age; } // “ ”。 private private Gender getGender() { return gender; } // “ ”。 private private void setGender(Gender gender) { this.gender = gender; } // getInner() InnerB, getEnclosingMethod() public void getInner() { // class InnerB{ } // InnerB Class Class cls = InnerB.class; // “ (InnerB)” Method cst = cls.getEnclosingMethod(); System.out.println("call--\"getInner()\" cst="+cst); } @Override public String toString() { return "("+name+", "+age+", "+gender+")"; } }
注意:プログラムが実行できない場合は、「forName()」のパッケージ名が正しいか確認してください。forName()のパラメータは、Personクラスのフルネームでなければなりません。
実行結果:

getDeclaredMethod() : person=(Jimmy, 30, MALE), name=Jimmy, age=30, gender=MALE
getMethod() : person=(Phobe, 0, FEMALE)
call--"getInner()" cst=public void com.bjpowernode.test.Person.getInner()
getEnclosingMethod : person=(unknown, 0, FEMALE)
2.3メンバー変数
「メンバ変数」に関するAPI

//   “   name” public     (        、        public    )
public Field  getField(String name)
//      public    (        、        public    )
public Field[]  getFields()
//   “   name”,             ,  public、protected private    。
public Field  getDeclaredField(String name)
//                ,  public、protected private    。
public Field[]  getDeclaredFields()
   ,         API    。    (DemoClassField.java)  :
package com.bjpowernode.test;
import java.lang.Class;
import java.lang.reflect.Field;
/**
 * java Class  "    "  API     
 *
 * 
 */
public class DemoClassField {
  public static void main(String[] args) {
    // getDeclaredField()      
    testGetDeclaredField() ;
    // getField()      
    testGetField() ;
  }
  /**
   * getDeclaredField()      
   * getDeclaredField()                   ,  public、protected private  。
   */
  public static void testGetDeclaredField() {
    try {
      //   Person  Class
      Class<?> cls = Class.forName("com.bjpowernode.test.Person");
      //   class,          (    )
      Object person = cls.newInstance();
      //   class,  Filed
      Field fName = cls.getDeclaredField("name");
      Field fAge = cls.getDeclaredField("age");
      Field fGender = cls.getDeclaredField("gender");
      //       ,       
      fName.set(person, "Hamier");
      fAge.set(person, 31);
      fGender.setAccessible(true); //   "flag" private  ,          true;  ,     。
      fGender.set(person, Gender.FEMALE);
      System.out.printf("%-30s: person=%s
", "getDeclaredField()", person); } catch (Exception e) { e.printStackTrace(); } } /** * getField() * getField() public “ ” */ public static void testGetField() { try { // Person Class Class<?> cls = Class.forName("com.bjpowernode.test.Person"); // class, ( ) Object person = cls.newInstance(); // class, Filed Field fName = cls.getField("name"); Field fAge = cls.getDeclaredField("age"); // , Person age protected 。 Field fGender = cls.getDeclaredField("gender"); // , Person gender private 。 // , fName.set(person, "Grace"); //fAge.set(person, 26); //fGender.set(person, Gender.FEMALE); System.out.printf("%-30s: person=%s
", "getField()", person); } catch (Exception e) { e.printStackTrace(); } } } // 。 “ ” enum Gender{ MALE, FEMALE } // class Person { // private。 private Gender gender; // protected。 protected int age; // public。 public String name; public Person() { this("unknown", 0, Gender.FEMALE); } public Person(String name, int age, Gender gender) { this.name = name; this.age = age; this.gender = gender; } @Override public String toString() { return "("+name+", "+age+", "+gender+")"; } }
注意:プログラムが実行できない場合は、「forName()」のパッケージ名が正しいか確認してください。forName()のパラメータは、Personクラスのフルネームでなければなりません。
実行結果:

getDeclaredField() : person=(Hamier, 31, FEMALE)
getField() : person=(Grace, 0, FEMALE)
2.4 クラスの他の情報
2.4.1「注釈」に関するAPI

//     "annotationClass"      (        、        public    )
public Annotation<A>  getAnnotation(Class annotationClass)
//          (        、        public    )
public Annotation[]  getAnnotations()
//              (  public、protected private    )
public Annotation[]  getDeclaredAnnotations()
   ,         API    。    (DemoClassAnnotation.java)  :
package com.bjpowernode.test;
import java.lang.Class;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
 * java Class getAnnotation()     
 */
public class DemoClassAnnotation {
  public static void main(String[] args) {
    try {
      //   “  ”      Class  
      Class<?> cls = Class.forName("com.bjpowernode.test.Person");
      //   “Person ”   
      MyAnnotation myann = cls.getAnnotation(MyAnnotation.class);
      System.out.println("myann="+myann);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
/**
 * MyAnnotation       Annotation
 */
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
}
/**
 * MyAnnotation  Person   。
 */
@MyAnnotation 
class Person {
}
注意:プログラムが実行できない場合は、「forName()」のパッケージ名が正しいか確認してください。forName()のパラメータは、Personクラスのフルネームでなければなりません。
実行結果:
[email protected]()
説明:
(01)MyAnnotationはAnnotationの注釈をカスタマイズしています。もし読者が「注釈」が分からないなら、博文「TODO」を参考にしてもいいです。
(02)get Annotation()はこのカテゴリーの注釈を取得することです。
1.1.1.1
2.4.2「親類」と「インターフェース」に関するAPI

//          
public Type[]  getGenericInterfaces()
//     
public Type  getGenericSuperclass()
コード例(DemoClass Interface.java)は以下の通りです。

package com.bjpowernode.test;
import java.io.Serializable;
import java.lang.Runnable;
import java.lang.Thread;
import java.lang.Class;
import java.lang.reflect.Type;
/**
 * java Class            
 */
public class DemoClassInterface {
  public static void main(String[] args) {
    try {
      //   “  ”      Class  
      Class<?> cls = Class.forName("com.bjpowernode.test.Person");
      //   “Person”   
      Type father = cls.getGenericSuperclass();
      //   “Person”       
      Type[] intfs = cls.getGenericInterfaces();
      System.out.println("father="+father);
      for (Type t:intfs)
        System.out.println("t="+t);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
/**
 * Person     Object,     Serializable Runnable  
 */
class Person extends Object implements Serializable, Runnable{
  @Override
  public void run() {
  }
}
注意:プログラムが実行できない場合は、「forName()」のパッケージ名が正しいか確認してください。forName()のパラメータは、Personクラスのフルネームでなければなりません。
実行結果:

father=class java.lang.Object
t=interface java.io.Serializable
t=interface java.lang.Runnable 
2.4.3残りのAPI

//   “  ”
public String  getSimpleName()
//   “    ”
public String  getName()
//     “   ”
public boolean  isEnum()
// obj       
public boolean  isInstance(Object obj)
//     “  ”
public boolean  isInterface()
//     “   ”。   ,           。
public boolean  isLocalClass()
//     “   ”。   ,       ,     “   ” “   ”。
public boolean  isMemberClass()
//     “    ”。     ,  void boolean、byte、char、short、int、long、float   double     。
public boolean  isPrimitive()
//     “   ”。 JVM        , java        “   ”!
public boolean  isSynthetic()
実例コード(DemoClass Other API s.java)は以下の通りです。

package com.bjpowernode.test;
import java.lang.Class;
import java.lang.Runnable;
import java.lang.annotation.ElementType;
import java.util.TreeMap;
/**
 * java Class  getName(), isInterface()     
 *
 * 
 */
public class DemoClassOtherAPIs {
  public static void main(String[] args) {
    Class cls = DemoClassOtherAPIs.class;
    //   “  ”
    System.out.printf("%-50s:getSimpleName()=%s
", cls, cls.getSimpleName()); // “ ” System.out.printf("%-50s:getName()=%s
", cls, cls.getName()); // API testOtherAPIs() ; } public static void testOtherAPIs() { // class LocalA { } // 。ElementType Class elementtypeCls = ElementType.class; System.out.printf("%-50s:isEnum()=%s
", elementtypeCls, elementtypeCls.isEnum()); // Class demoCls = DemoClassOtherAPIs.class; DemoClassOtherAPIs demoObj = new DemoClassOtherAPIs(); System.out.printf("%-50s:isInstance(obj)=%s
", demoCls, demoCls.isInstance(demoObj)); // “ ” Class runCls = Runnable.class; System.out.printf("%-50s:isInterface()=%s
", runCls, runCls.isInterface()); // “ ”。 , 。 Class localCls = LocalA.class; System.out.printf("%-50s:isLocalClass()=%s
", localCls, localCls.isLocalClass()); // “ ”。 , , “ ” “ ”。 Class memCls = MemberB.class; System.out.printf("%-50s:isMemberClass()=%s
", memCls, memCls.isMemberClass()); // “ ”。 , void boolean、byte、char、short、int、long、float double 。 Class primCls = int.class; System.out.printf("%-50s:isPrimitive()=%s
", primCls, primCls.isPrimitive()); // “ ”。 JVM , java “ ”! Class synCls = DemoClassOtherAPIs.class; System.out.printf("%-50s:isSynthetic()=%s
", synCls, synCls.isSynthetic()); } // class MemberB { } }
注意:プログラムが実行できない場合は、「forName()」のパッケージ名が正しいか確認してください。forName()のパラメータは、Personクラスのフルネームでなければなりません。
実行結果:

class com.bjpowernode.test.DemoClassOtherAPIs :getSimpleName()=DemoClassOtherAPIs
class com.bjpowernode.test.DemoClassOtherAPIs :getName()=com.bjpowernode.test.DemoClassOtherAPIs
class java.lang.annotation.ElementType :isEnum()=true
class com.bjpowernode.test.DemoClassOtherAPIs :isInstance(obj)=true
interface java.lang.Runnable :isInterface()=true
class com.bjpowernode.test.DemoClassOtherAPIs$1LocalA :isLocalClass()=true
class com.bjpowernode.test.DemoClassOtherAPIs$MemberB :isMemberClass()=true
int :isPrimitive()=true
class com.bjpowernode.test.DemoClassOtherAPIs :isSynthetic()=false
説明:isSync thetic()は、クラスが「複合類」かどうかを判断するために使われます。これはjavaアプリケーションでfalseだけ戻ります。trueに戻りません。JVMの中で複合類ができます。javaアプリケーションには「複合類」が存在しません。
以上は小编でご绍介したJava反射メカニズムの详细です。動力ノードJava学院は整理して、みんなに助けがあることを望んで、もしみんなはいかなる疑問があるならば、メッセージを下さい。ここでも私たちのサイトを応援してくれてありがとうございます。