Java反射機構の詳細解_動力ノードJava学院の整理
Java反射メカニズムの紹介
Java反射機構通俗的に言えば、運行状態の中で、「類の部分がすでに持っている情報」によって、「類のすべての情報」を元に戻すことができます。ここで「クラスの部分が既に持っている情報」は、「クラス名」や「クラスの対象」などの情報とすることができます。クラスのすべての情報とは、「クラスの属性、方法、継承関係、Annotation注解」などの内容です。
簡単な例を挙げます。例えば、クラスReflectionTest.javaについて、私達が知っている唯一の情報はその類名です。「comp.bjpowernode.Reflection」です。この時、ReflectionTest.javaの他の情報(例えば、その構造関数、そのメンバー変数など)を知りたいですが、どうすればいいですか?
これは「反射」が必要です。反射によって,ReflectionTest.javaの完全な情報を解析でき,その構造関数,メンバー変数,継承関係などを含む。
「java反射機構」の概念を理解した後で、クラスの名前によって、クラスの完全な情報を得るにはどうすればいいですか?
このプロセスは主に二つのステップに分けられます。
ステップ1:クラス名によってクラスのクラスのオブジェクトを取得します。
第2ステップ:クラスオブジェクトの関数インターフェースを通して、「クラスの構造関数、メンバー変数」などの情報を読みだします。
以下では、例に従って、この概念の理解を深める。例は以下の通りです。
(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つの方法を例示的に示します。例は以下の通りです。
クラスのすべてのAPIは以下の表の通りです。
クラスのすべてのAPIは以下の表の通りです。
2.1コンストラクタ
「コンストラクション」関連API
実行結果:
(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」
実行結果:
「メンバ変数」に関するAPI
実行結果:
2.4.1「注釈」に関するAPI
実行結果:
[email protected]()
説明:
(01)MyAnnotationはAnnotationの注釈をカスタマイズしています。もし読者が「注釈」が分からないなら、博文「TODO」を参考にしてもいいです。
(02)get Annotation()はこのカテゴリーの注釈を取得することです。
1.1.1.1
2.4.2「親類」と「インターフェース」に関するAPI
実行結果:
実行結果:
以上は小编でご绍介した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学院は整理して、みんなに助けがあることを望んで、もしみんなはいかなる疑問があるならば、メッセージを下さい。ここでも私たちのサイトを応援してくれてありがとうございます。