java笔记01-反射

--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 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

知识点:----

这里其实大概的思想要有,就是用反射包里面的类,获取对象,然后就和普通对象一样进行反射操作。

剩下的参考文档吧,或者仔细看上面的代码。

原文地址:https://www.cnblogs.com/qinche/p/3217901.html