zoukankan      html  css  js  c++  java
  • JAVA 反射特性

    1.   反射(概念):程序在运行期可以改变程序结构和变量类型,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

    2.   反射的特性:  

    •在运行时判断任意一个对象所属的类  

    •在运行时构造任意一个类的对象  

    •在运行时判断任意一个类所具有的成员变量和方法  

    •在运行时调用任意一个对象的方法

    3. 反射的前传:类类型   Class Class     java中有一个类很特殊,就是Class类,大家就可以把它理解为封装了类的信息,很多解释说Class类没有构造器,其实是有的,

     只不过它的构造方法是private的(构造函数设置成private,这样是为了禁止开发者去自己创建Class类的实例,就像单例模式中的构造方法一样要用private)。我们可以看一下JDK中源码:                                                                                                                                

     class Class<T> implements java.io.Serializable, 
                      java.lang.reflect.GenericDeclaration, 
                      java.lang.reflect.Type,
                                  java.lang.reflect.AnnotatedElement {
        private static final int ANNOTATION= 0x00002000;
        private static final int ENUM      = 0x00004000;
        private static final int SYNTHETIC = 0x00001000;
    
        private static native void registerNatives();
        static {
            registerNatives();
        }
    
        /*
         * Constructor. Only the Java Virtual Machine creates Class
         * objects.
         */
        private Class() {}
    
      ..... 


         注释很明确的告诉了我们,这个类是有JVM来创建的,所以我们就不用麻烦了。如果我们拿到一个类的类型信息,就可以利用反射获取其各种成员以及方法了。  (注:Class 从JDK1.5版本后就开始更多为泛型服务了)那么我们怎么拿到一个类型的信息呢?假设我们有一个Monkey类:  

       

        4.    获取类的构造器      

    首先介绍一下Constructor类,这个类用来封装反射得到的构造器,Class有四个方法来获得Constructor对象  

    •public Constructor<?>[] getConstructors()              返回类中所有的public构造器集合,默认构造器的下标为0  

    •public Constructor<T> getConstructor(Class<?>... parameterTypes)     返回指定public构造器,参数为构造器参数类型集合  

    •public Constructor<?>[] getDeclaredConstructors()        返回类中所有的构造器,包括私有  

    •public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  

    返回任意指定的构造器    从名字来看,还是很好懂的,带上Declared的都是获得所有的构造方法,包括私有,哈,这下我们就可以调用原本不允许调用的私有构造器了,看代码    

    /**  2          * 获取构造方法Constructor  

    3          * getConstructor()  only for public  

    4          * getDeclaredConstructor()  global access all  

    5          *

     6          * */  

    7          

    8         //指定参数列表获取特定的方法  

    9         Constructor con = cls1.getDeclaredConstructor(new Class[]{String.class});

    10         con.setAccessible(true); //设置可访问的权限

    11         Object obj = con.newInstance(new Object[]{"liyang"});

    12         System.out.println(obj);  //打印一下这个对象的信息

    13        

    14 //获取所有的构造方法集合

    15         Constructor con1[] = cls1.getDeclaredConstructors();

    16         con1[1].setAccessible(true);

    17         Object obj1 = con1[1].newInstance(new Object[]{"tom"});

    18         System.out.println(obj1);

    5.   获取类的成员变量

     •public Field getDeclaredField(String name)    获取任意指定名字的成员  

    •public Field[] getDeclaredFields()              获取所有的成员变量  

    •public Field getField(String name)             获取任意public成员变量  

    •public Field[] getFields()                        获取所有的public成员变量     

    /**2          * 获取成员变量Field   

    3          * getField()   

    4          * getDeclaredField()   

    5          * */   

    6         Field mem = cls1.getDeclaredField("name");   

    7         mem.setAccessible(true);        

    8         System.out.println("we get form field :"+mem.get(obj));       

    6.  获取类的方法 

     •public Method[] getMethods()    获取所有的共有方法的集合  

    •public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合   

    •public Method[] getDeclaredMethods()  获取所有的方法  

    •public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法

     7.     其他相关特性

    7-1:  获取方法的类型Modifier

                int  modifier =  method.getModifiers();  // public , protected,  private ,...

    7.2    获取参数类型

               Class<?> para[]=method[ii].getParameterTypes();

               Class<?> p[]=constr[i].getParameterTypes();

    7.3  获取返回值类型

                  Class<?> returnType=method[ii].getReturnType();

    7.4  获取异常类型

                  Class<?> exce[]=method[i].getExceptionTypes();

    本文引用:  http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html

                 http://www.cnblogs.com/octobershiner/archive/2012/03/18/2404751.html

  • 相关阅读:
    大宗商品经营管理特点与风险节点
    大宗商品企业风险管理与套期会计课程
    推荐一个php7+ mongodb三方类
    利用Redis锁解决高并发问题
    PHP socket初探 --- 关于IO的一些枯燥理论
    Swoole 4.1.0 正式版发布,支持原生 Redis/PDO/MySQLi 协程化
    PHP利用Mysql锁解决高并发
    PHP AES cbc模式 pkcs7 128加密解密
    PHP 利用文件锁处理高并发
    Redis 应用场景【商品拼团抢购】
  • 原文地址:https://www.cnblogs.com/dragonflyyi/p/4003683.html
Copyright © 2011-2022 走看看