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

    知识点:----

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

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

  • 相关阅读:
    C#遍历List并删除某个或者几个元素的方法
    7月清北学堂培训 Day 4
    7月清北学堂培训 Day 3
    7月清北学堂培训 Day 2
    7月清北学堂培训 Day 1
    P1383 高级打字机
    P2401 不等数列
    P1412 经营与开发
    P1314 聪明的质监员
    2019.7.9 校内测试 T3 15数码问题
  • 原文地址:https://www.cnblogs.com/qinche/p/3217901.html
Copyright © 2020-2023  润新知