--2013年7月26日17:56:35
写文章之前,参考了这篇:http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html
评价:这个作者写的像个字典,我照着看了,里面的代码觉得乱,还是自己整理一篇。
--先看一段代码,这段代码,基本可以演示反射我想总结的东西.
1 package com.dev; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 import java.lang.reflect.Modifier; 7 8 class Tst { //提供反射用的类 9 private int x; 10 public int y; 11 public String str1 = "abc"; 12 public String str2 = "123"; 13 public Tst(){}; 14 public Tst(int x, int y) { 15 super(); 16 this.x = x; 17 this.y = y; 18 } 19 @Override 20 public String toString() { 21 return "Tst [x=" + x + ", y=" + y + ", str1=" + str1 + ", str2=" + str2 22 + "]"; 23 } 24 25 } 26 public class ReflectClass { 27 28 public static void main(String[] args) throws Throwable { 29 Tst tst = new Tst(1,2); 30 changeField(tst); 31 printClass(tst); 32 getFields(tst); 33 printConstructors(tst); 34 printMethods(tst); 35 } 36 37 private static void printClass(Object obj) throws Throwable{ 38 39 Class<?> clazz = obj.getClass(); 40 41 String modifers = Modifier.toString(clazz.getModifiers()); 42 if(modifers.length() > 0); 43 log("--class basic info--"); 44 log("modifers=" +modifers); 45 log("className()=" + clazz.getName()); 46 Class<?> superClasses = clazz.getSuperclass(); 47 if(superClasses != null && !Object.class.equals(superClasses)){ 48 log("extends:" + superClasses.getName() + " "); 49 } 50 51 Class<?>[] interfaces = clazz.getInterfaces(); 52 if(interfaces.length > 0){ 53 log("implents--"); 54 for(Class<?> interfacez : interfaces){ 55 log("impls="+interfacez.getName()); 56 } 57 } 58 } 59 60 private static void getFields(Object obj) throws Exception{ 61 Class<?> clazz = obj.getClass(); 62 Field[] fields = clazz.getDeclaredFields(); 63 log("--class fields info--"); 64 for(Field field : fields){ 65 String modifers = Modifier.toString(field.getModifiers()); 66 String fName = field.getName(); 67 // fieldX.setAccessible(true); 68 field.setAccessible(true); 69 Object val = (Object)field.get(obj); 70 log( fName+"="+val+",modifers="+modifers+",type="+field.getType().getName() ); 71 // log("modifers="+modifers+",type="+field.getType().getName() + ",name=" + fName+",val="+clazz.getField(fName)); 72 } 73 } 74 75 private static void printConstructors(Object obj){ 76 Class<?> clazz = obj.getClass(); 77 log("--class constructor info--"); 78 Constructor<?>[] constructors = clazz.getConstructors(); 79 log("constructors total count ="+ constructors.length); 80 for(Constructor<?> constructor : constructors){ 81 82 String modifers = Modifier.toString(constructor.getModifiers()); 83 if(modifers.length() > 0); 84 Class<?>[] parameterTypes = constructor.getParameterTypes(); 85 log("modifers="+modifers+",CONSName="+constructor.getName() + "--parameterCount="+parameterTypes.length); 86 for(Class<?> parameterType : parameterTypes){ 87 log("paramter="+parameterType.getName()); 88 } 89 } 90 } 91 92 private static void printMethods(Object obj){ 93 Class<?> clazz = obj.getClass(); 94 log("--class Methods info--"); 95 Method[] methods = clazz.getMethods(); 96 int i = 1; 97 for(Method method : methods){ 98 String modifers = Modifier.toString(method.getModifiers()); 99 Class<?> returnType = method.getReturnType(); 100 Class<?>[] parameterTypes = method.getParameterTypes(); 101 String mName = method.getName(); 102 log(methods.length+"-"+i+":"+mName+"()-modifers="+modifers+",returnType="+returnType.getName()); 103 i++; 104 for(Class<?> parameterType : parameterTypes){ 105 log(" "+parameterTypes.length+"lparameterType="+parameterType.getName()); 106 } 107 } 108 } 109 private static void changeField(Object obj) throws Exception{ 110 log("--before="+obj); 111 Field field = obj.getClass().getField("str1"); 112 field.set(obj, "after22"); 113 log("--after="+obj); 114 } 115 private static void log(String log){ 116 System.out.println(log); 117 } 118 }
知识点1:获得某个类的字节码类对象(Class)的方法有3种:
1、ReflectPoint.class (类名.class)
2、reflectPoint.getClass() (对象名.getClass())
3、Class.forName("com.juziku.ReflectPoint") (Class.forName(类名的路径))
知识点2:获得Field类对象,得到这个对象就可以进行操作了
JAVA 的Class<T>类提供了几个方法获取类的属性。
public Field getField(String name) 返回一个 Field 对象,返回值是一个属性对象,用这个返回对象可以操作这个属性。
public Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段
public Field getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
public Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段
知识点3:获取类的Method
public Method getMethod(String name, Class<?>... parameterTypes)返回一个 Method 对象
public Method[] getMethods()返回一个包含某些 Method 对象的数组
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
返回一个 Method 对象
public Method[] getDeclaredMethods()返回 Method 对象的一个数组,
这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
知识点:----
这里其实大概的思想要有,就是用反射包里面的类,获取对象,然后就和普通对象一样进行反射操作。
剩下的参考文档吧,或者仔细看上面的代码。