JAva反射メカニズムの深い研究


Java        
 
Java    Java           ,   Java   “   ”。
 
 Java      ,       ,               ?        ,            ?      。                           Java      (Reflection)  。
 
Java              :
                。
              。
                      。
               。
 
Reflection  Java     (    )         。              Reflection APIs           class     ,   modifiers(  public, static   )、superclass(  Object)、   interfaces(  Serializable),   fields methods     ,        fields     methods。
 
    ,           ,          :“     ,             ,          ”。      ,Perl,Python,Ruby     ,C++,Java,C#      。
 
            Java      ,                 :Reflection。       “  、  、  ”,  Java               、  、           classes。    ,Java                 class,       (    methods  ),        、   fields  、    methods。  “  class”   (the ability of the program to examine itself)   introspection(  、  、  )。Reflection introspection          。
 
 JDK ,         Java    ,      java.lang.reflect  :
Class :     。
Field  :        (           )。
Method :      。
Constructor  :        。
Array :         ,              。
 
          Reflection API     :
 
 、  Class       、    、  、  、     
 
 java.lang.Object      getClass()  ,        Java  ,               。Class  Reflection API      ,      
getName():        。
getFields():    public     。
getDeclaredFields():        。
getMethods():    public     。
getDeclaredMethods():        。
getMethod(String name, Class[] parameterTypes):        ,name         ,parameterTypes            。
getConstructors():    public       。
getConstructor(Class[] parameterTypes):          ,parameterTypes              。
newInstance():                       。
 
             :
 
public class RefConstructor {
 
    public static void main(String args[]) throws Exception {
        RefConstructor ref = new RefConstructor();
        ref.getConstructor();
 
    }
 
    public void getConstructor() throws Exception {
        Class c = null;
        c = Class.forName("java.lang.Long");
        Class cs[] = {java.lang.String.class};
 
        System.out.println("
-------------------------------
"); Constructor cst1 = c.getConstructor(cs); System.out.println("1、 Class :"); System.out.println(cst1.toString()); Constructor cst2 = c.getDeclaredConstructor(cs); System.out.println("2、 Class :"); System.out.println(cst2.toString()); Constructor cst3 = c.getEnclosingConstructor(); System.out.println("3、 Constructor , 。"); if (cst3 != null) System.out.println(cst3.toString()); else System.out.println("-- !"); Constructor[] csts = c.getConstructors(); System.out.println("4、 Class :"); for (int i = 0; i < csts.length; i++) { System.out.println(csts[i].toString()); } System.out.println("
-------------------------------
"); Type types1[] = c.getGenericInterfaces(); System.out.println("1、 :"); for (int i = 0; i < types1.length; i++) { System.out.println(types1[i].toString()); } Type type1 = c.getGenericSuperclass(); System.out.println("2、 :"); System.out.println(type1.toString()); Class[] cis = c.getClasses(); System.out.println("3、 :"); for (int i = 0; i < cis.length; i++) { System.out.println(cis[i].toString()); } Class cs1[] = c.getInterfaces(); System.out.println("4、 "); for (int i = 0; i < cs1.length; i++) { System.out.println(cs1[i].toString()); } System.out.println("
-------------------------------
"); Field fs1[] = c.getFields(); System.out.println("1、 :"); for (int i = 0; i < fs1.length; i++) { System.out.println(fs1[i].toString()); } Field f1 = c.getField("MIN_VALUE"); System.out.println("2、 :"); System.out.println(f1.toString()); Field fs2[] = c.getDeclaredFields(); System.out.println("3、 :"); for (int i = 0; i < fs2.length; i++) { System.out.println(fs2[i].toString()); } Field f2 = c.getDeclaredField("serialVersionUID"); System.out.println("4、 :"); System.out.println(f2.toString()); System.out.println("
-------------------------------
"); Method m1[] = c.getMethods(); System.out.println("1、 :"); for (int i = 0; i < m1.length; i++) { System.out.println(m1[i].toString()); } Method m2 = c.getMethod("longValue", new Class[]{}); System.out.println("2、 :"); System.out.println(m2.toString()); } } : , 。 、 ReflectTester Reflection API 。ReflectTester copy(Object object) , object , object , JavaBean, JavaBean public getXXX() setXXX() 。 public class ReflectTester { public Object copy(Object object) throws Exception { // Class<?> classType = object.getClass(); System.out.println("Class:" + classType.getName()); // Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{}); // Field fields[] = classType.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; String fieldName = field.getName(); String firstLetter = fieldName.substring(0, 1).toUpperCase(); // getXXX() String getMethodName = "get" + firstLetter + fieldName.substring(1); // setXXX() String setMethodName = "set" + firstLetter + fieldName.substring(1); // getXXX() Method getMethod = classType.getMethod(getMethodName, new Class[]{}); // setXXX() Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()}); // getXXX() Object value = getMethod.invoke(object, new Object[]{}); System.out.println(fieldName + ":" + value); // setXXX() setMethod.invoke(objectCopy, new Object[]{value}); } return objectCopy; } public static void main(String[] args) throws Exception { Customer customer = new Customer("Tom", 21); customer.setId(new Long(1)); Customer customerCopy = (Customer) new ReflectTester().copy(customer); System.out.println("Copy information:" + customerCopy.getId() + " " + customerCopy.getName() + " " + customerCopy.getAge()); } } class Customer { private Long id; private String name; private int age; public Customer() { } public Customer(String name, int age) { this.name = name; this.age = age; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } : Class:com.langsin.reflection.Customer id:1 name:Tom age:21 Copy information:1 Tom 21 Process finished with exit code 0 : ReflectTester copy(Object object) (1) : Class classType=object.getClass(); System.out.println("Class:"+classType.getName()); (2) : Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{}); Class getConstructor() Constructor , , Constructor newInstance() 。 3) : Field fields[]=classType.getDeclaredFields(); Class getDeclaredFields() , public、protected、 private (4) getXXX() setXXX() , , 、 public class InvokeTester { public int add(int param1, int param2) { return param1 + param2; } public String echo(String msg) { return "echo: " + msg; } public static void main(String[] args) throws Exception { Class<?> classType = InvokeTester.class; Object invokeTester = classType.newInstance(); // Object invokeTester = classType.getConstructor(new // Class[]{}).newInstance(new Object[]{}); // InvokeTester add() Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class}); // invokeTester add() Object result = addMethod.invoke(invokeTester, new Object[]{new Integer(100), new Integer(200)}); System.out.println((Integer) result); // InvokeTester echo() Method echoMethod = classType.getMethod("echo", new Class[]{String.class}); // invokeTester echo() result = echoMethod.invoke(invokeTester, new Object[]{"Hello"}); System.out.println((String) result); } } InvokeTester main() , InvokeTester add() echo() add() int , add() Method : Method addMethod=classType.getMethod("add",new Class[]{int.class,int.class}); Method invoke(Object obj,Object args[]) , , 。invoke() , , invoke() , 。 , InvokeTester add() int , add Method invoke() , Integer , invoke() Integer ,Integer int : Object result=addMethod.invoke(invokeTester, new Object[]{new Integer(100),new Integer(200)}); System.out.println((Integer)result); //result Integer 、 java.lang.Array 。 ArrayTester1 main() 10 , 5 “hello”, 5 public class ArrayTester1 { public static void main(String args[]) throws Exception { Class<?> classType = Class.forName("java.lang.String"); // 10 Object array = Array.newInstance(classType, 10); // 5 "hello" Array.set(array, 5, "hello"); // 5 String s = (String) Array.get(array, 5); System.out.println(s); } } ArrayTester2 main() 5 x 10 x 15 , [3][5][10] 37。 public class ArrayTester2 { public static void main(String args[]) { int[] dims = new int[]{5, 10, 15}; // 。 Object array = Array.newInstance(Integer.TYPE, dims); Object arrayObj = Array.get(array, 3); Class<?> cls = arrayObj.getClass().getComponentType(); System.out.println(cls); arrayObj = Array.get(arrayObj, 5); Array.setInt(arrayObj, 10, 37); int arrayCast[][][] = (int[][][]) array; System.out.println(arrayCast[3][5][10]); } } Class Java Object , Java , Java :hashCode()、equals()、clone()、toString()、getClass() 。 getClass() Class 。 Class 。 classes Object, Java classes interfaces, enum、array、primitive Java types (boolean, byte, char, short, int, long, float, double) void。 class , (class loader) defineClass() JVM ,JVM Class object。 “ Java ” Class object ( Class constructor println()), ! Class public constructor Class Reflection 。 class, Class object, Reflection APIs Java class Class 。 《 java.long.Class 》 。 , Reflection , “ ctor”, “ ctor”。 “ ctor“ , Class newInstance(), Constructor newInstance()。 Class[] ctor ( double int), getConstructor(), ctor。 Object[] ctor ( 3.14159 125), ctor newInstance()。 “Class object class” ; 。 “ ctor” 。 Class[] ( String, Hashtable), getMethod(), Method object。 Object[] , Method object invoke()。 Method object ? method overloading signature , signature 。 , method , method。 、 field ,“ field ” , 。 Class getField() field 。 Field object Field get() set()。 public class RefFiled { public double x; public Double y; public static void main(String args[]) throws NoSuchFieldException, IllegalAccessException { Class c = RefFiled.class; Field xf = c.getField("x"); Field yf = c.getField("y"); RefFiled obj = new RefFiled(); System.out.println(" x=" + xf.get(obj)); // x xf.set(obj, 1.1); System.out.println(" x=" + xf.get(obj)); System.out.println(" y=" + yf.get(obj)); // y yf.set(obj, 2.1); System.out.println(" y=" + yf.get(obj)); } } : x=0.0 x=1.1 y=null y=2.1 Process finished with exit code 0 : http://bbs.langsin.com。 《 Java 》http://www.j2medev.com/Article/Class3/Class7/200604/1995.html think in java Java : , , 。 , , , 。 ----------------- : Java , , Java , 《Java Reflection in Action》 , 。