天天看點

[原創]java反射技術(一)

java的反射技術功能十分強大,整理一些資料!!

(如需轉載,請注明出處!)

Lesson: 檢測類examing class

1.Retrieving Class Objects

擷取一個Class對象(metadata)

a,從對象的執行個體擷取。

Class c = mystery.getClass();//(return Class)

b,從子類的執行個體擷取

TextField t = new TextField();

Class c = t.getClass();

Class s = c.getSuperclass();

c,知道類名,則可以把.class加入到名字之後來擷取。

Class c = java.awt.Button.class;

d,如果類名在編譯時是未知的,則可以使用Class.forName()方法來擷取.

Class c = Class.forName(classString);

2.Getting the Class Name

擷取類名稱

 c.getName();

例如:

import java.lang.reflect.*;

import java.awt.*;

class SampleName {

   public static void main(String[] args) {

      Button b = new Button();

      printName(b);

   }

   static void printName(Object o) {

       Class c = o.getClass();

       String s = c.getName();

       System.out.println(s);

   }

}

3.Discovering Class Modifiers

檢索修改符

a.通過getModifiers()方法擷取一個整型辨別值。

b.通過java.reflect.Modifier對象的isPublic, isAbstract, 和 isFinal方法判斷此值.

例如:

import java.lang.reflect.*;

import java.awt.*;

class SampleModifier {

   public static void main(String[] args) {

      String s = new String();

      printModifiers(s);

   }

   public static void printModifiers(Object o) {

      Class c = o.getClass();

      int m = c.getModifiers();

      if (Modifier.isPublic(m))

         System.out.println("public");

      if (Modifier.isAbstract(m))

         System.out.println("abstract");

      if (Modifier.isFinal(m))

         System.out.println("final");

   }

}

4.Finding Superclasses

檢索父類

例如:

import java.lang.reflect.*;

import java.awt.*;

class SampleSuper {

   public static void main(String[] args) {

      Button b = new Button();

      printSuperclasses(b);

   }

   static void printSuperclasses(Object o) {

      Class subclass = o.getClass();

      Class superclass = subclass.getSuperclass();

      while (superclass != null) {

         String className = superclass.getName();

         System.out.println(className);

         subclass = superclass;

         superclass = subclass.getSuperclass();

      }

   }

}

5.Identifying the Interfaces Implemented by a Class

檢索指定類實作的接口

例如:

import java.lang.reflect.*;

import java.io.*;

class SampleInterface {

   public static void main(String[] args) {

      try {

          RandomAccessFile r = new RandomAccessFile("myfile", "r");

          printInterfaceNames(r);

      } catch (IOException e) {

          System.out.println(e);

      }

   }

   static void printInterfaceNames(Object o) {

      Class c = o.getClass();

      Class[] theInterfaces = c.getInterfaces();

      for (int i = 0; i < theInterfaces.length; i++) {

         String interfaceName = theInterfaces[i].getName();

         System.out.println(interfaceName);

      }

   }

}

6.Examining Interfaces

判定一個類是不是接口

import java.lang.reflect.*;

import java.util.*;

class SampleCheckInterface {

   public static void main(String[] args) {

      Class thread = Thread.class;

      Class runnable = Runnable.class;

      verifyInterface(thread);

      verifyInterface(runnable);

   }

   static void verifyInterface(Class c) {

      String name = c.getName();

      if (c.isInterface()) {

         System.out.println(name + " is an interface.");

      } else {

         System.out.println(name + " is a class.");

      }

   }

}

如:c.isInterface()

7.Identifying Class Fields

找出指定類所有的域成員

每個資料成員可以用java.reflect.Field來封閉其名稱,類型,修改符的集合。

也可以通過相應的方法擷取或設定到該成員的值。

如:

import java.lang.reflect.*;

import java.awt.*;

class SampleField {

   public static void main(String[] args) {

      GridBagConstraints g = new GridBagConstraints();

      printFieldNames(g);

   }

   static void printFieldNames(Object o) {

      Class c = o.getClass();

      Field[] publicFields = c.getFields();

      for (int i = 0; i < publicFields.length; i++) {

         String fieldName = publicFields[i].getName();

         Class typeClass = publicFields[i].getType();

         String fieldType = typeClass.getName();

         System.out.println("Name: " + fieldName +

           ", Type: " + fieldType);

         }

      }

}

8.Discovering Class Constructors

檢索指定類的構造函數

當建立一個類的執行個體時,是通過檢造方法來作的,這種方法可以被重載。

每一個構造方法可以用類Constructor來描述,,包括名稱,修飾符,參數類型(Class[]),和異常清單。

可以通過一個Class的getConstructors方法擷取到該類的Constructor數組。

例程:

import java.lang.reflect.*;

import java.awt.*;

class SampleConstructor {

   public static void main(String[] args) {

      Rectangle r = new Rectangle();

      showConstructors(r);

   }

   static void showConstructors(Object o) {

      Class c = o.getClass();

      Constructor[] theConstructors = c.getConstructors();

      for (int i = 0; i < theConstructors.length; i++) {

         System.out.print("( ");

         Class[] parameterTypes =

            theConstructors[i].getParameterTypes();

         for (int k = 0; k < parameterTypes.length; k ++) {

            String parameterString = parameterTypes[k].getName();

            System.out.print(parameterString + " ");

            }

         System.out.println(")");

         }

   }

}

9.Obtaining Method Information

檢索方法

可以找到隸屬于一個類的所有方法,通過getMethods包含Method數組,進而得到該方法的傳回類型,修飾符,方法名稱,參數清單

步驟:

a.指定類的Class Object

b.getMethods()擷取Method[]對象

c,周遊該數組對象

例程:

import java.lang.reflect.*;

import java.awt.*;

class SampleMethod {

   public static void main(String[] args) {

      Polygon p = new Polygon();

      showMethods(p);

   }

   static void showMethods(Object o) {

      Class c = o.getClass();

      Method[] theMethods = c.getMethods();

      for (int i = 0; i < theMethods.length; i++) {

         String methodString = theMethods[i].getName();

         System.out.println("Name: " + methodString);

         String returnString =

           theMethods[i].getReturnType().getName();

         System.out.println("   Return Type: " + returnString);

         Class[] parameterTypes = theMethods[i].getParameterTypes();

         System.out.print("   Parameter Types:");

         for (int k = 0; k < parameterTypes.length; k ++) {

            String parameterString = parameterTypes[k].getName();

            System.out.print(" " + parameterString);

         }

         System.out.println();

      }

   }

}