现在的位置: 首页 > 综合 > 正文

反射

2019年09月19日 ⁄ 综合 ⁄ 共 2696字 ⁄ 字号 评论关闭
 1.反射是将类中的各个组成部分剖析出来,映射成一个个java对象。

  补充:类的组成:
   类-|属性
        |
        |方法-|成员方法(即实例方法  类方法)
                 |
                 |构造方法   
  作用:可以将类中的成员方法(Method),构造方法(Constructor),属性(Field)通过反射得到各个组成部分,我们就可以对各个部分进行操作。反射一般应用于框架中,可以提高程序的复用性。
 ---------------------------------------------------------------
 要想使用反射去获取各个组成部分,首先必须获取Class。
 也就是说,通过Class就可以获取到Constructor  Method, Field对象。
 
 怎样获取一个Class
  1.类型.class
  2.对象.getClass();
   注:以上两种方式,它们具有依赖性。依赖于具体的API
  3.通过Class的forName方法
   Class.forName(String className);
   
 ----------------------------------------------------------------------------------
 1.Constructor(构造器)
  有了构造器,可以创建对象。
  
  1.怎样得到一个构造器对象.
   Constructor Class.getConstructor(Class... c);
    只能获取public的构造
   Constructor[] Class.getConstructors();
    只能获取public的构造
   
   问题:以上操作,只能获取public构造器,那么怎样可以获取非publlic构造器?
    Constructor Class.getDeclaredConstructor(Class... c);    
    Constructor[] Class.getDeclaredConstructors();
    
  2.怎样通过Constructor去实例化对象.
   
   Constructor类中提供一个方法
    newInstance(Object... obj);
    注意:newInstance方法一定要与获取的构造器匹配,也就是说,构造器有参数,在newInstance时也要传递参数。
     
   权限修饰符
    public        包外  包外子类   包内   类内 
    protected     包外子类   包内   类内 
    默认          包内   类内 
    private       类内    
  
   问题:如果使用反射时,它的权限不在指定的范围内,是不是就不可以使用了?
    public void setAccessible(boolean flag)
                   throws SecurityException将此对象的 accessible 标志设置为指示的布尔值。
       值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
       值为 false 则指示反射的对象应该实施 Java 语言访问检查。
      
     这个方法是AccessibleObject类中的方法,这个类是Constructor,Field,Method的父类。
    
   扩展:我们也可以通过Class对象直接调用newInstance()方法,它默认使用的是无参数构造。 
   
 ----------------------------------------------------------------------------------------------
 Field类.
  它代表的是一个属性。对于属性我们的操作就是取舍与赋值操作。
  
  1.获取Filed
   Field Class.getField(String name);
   Field[] Class.getFileds();
   
   Class.getDeclaredField(String name);
   Class.getDeclaredFields();
   
   
  注意:反射是在java.lang.reflect包下. 
  
  2.对Filed操作.
   
   赋值
    set(Object obj,Object value);    //obj.属性=value
    obj:代表的是这个属性所属于的对象。
    value:代表的是属性值.
   取值
    get(Object obj)
    obj:代表的是这个属性所属于的对象。
  
-------------------------------------------------------------------------------
 Method类
  它代表的是一个方法对象。
  
 1.怎样获取一个Method
  
  Class.getMethod(String name,Class... obj);
  Class.getDeclaredMethod(String name,Class... obj);
  
  Class.getMethods();  获取的方法中包含了父类的方法
  Class.getDeclaredMethods();  只获取子类中的方法
  
 2.怎样让Method执行 
  Method类中有一个invoke方法。
  
  public Object invoke(Object obj,Object... objs)
   作用:是让Method代表的方法执行。
   
   参数:obj 就调用该方法的对象。
   参数:objs 它代表的是该方法的参数。
   返回值:得到的就是该Method对象代表的方法执行后的结果。
   
 问题1:如果方法是一个静态方法?
 
  如果Method代表的是一个静态方法,可以传递对象,也可以直接写null.
  
  
 问题2:如果Method代表的方法参数是一个数组类型怎样处理?
  需要在传递时,将参数强制转换成Object或在外层在包装一层数组。 

==============================================

希望能与更多的java程序员共同学习

扣扣联系:2531977855
  

抱歉!评论已关闭.