zoukankan      html  css  js  c++  java
  • 面试题:反射

    1、反射概念以及为什么要使用反射

    我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?

    那再考虑这样另一个场景,如果我们想要在运行期获得某个类Class的信息如它的属性、构造方法、一般方法 后再考虑是否创建它的对象,这种情况该怎么办呢?这就需要用到反射!

    我们.java文件在编译后会变成.class文件,这就像是个镜面,本身是.java,在镜中是.class,他们其实是一样的;那么同理,我们看到镜子的反射是.class,就能通过反编译,了解到.java文件的本来面目。即为反射。

    官方给出的概念:反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取它所有的成员变量和方法并且显示出来。

    2、获取类的三种方式

    [java] view plain copy
     
    1. //第一种方式:    
    2. Class c1 = Class.forName(User);    
    3. //第二种方式:    
    4. //java中每个类型都有class 属性.    
    5. Class c2 = User.class<span style="font-family: Arial, Helvetica, sans-serif;">;  </span>  
    6. //第三种方式:    
    7. //java语言中任何一个java对象都有getClass 方法    
    8. User u = new User();    
    9. Class c3 = u.getClass(); //c3是运行时类 (e的运行时类是User)    

    3、创建对象方法

    [java] view plain copy
     
    1. Class c =Class.forName("User");    
    2.     
    3. //创建此Class 对象所表示的类的一个新实例    
    4. Object o = c.newInstance(); //调用了User的无参数构造方法.    

    4、获取类属性

    a、获取所有属性修饰符、属性名

    [java] view plain copy
     
    1. //获取整个类    
    2.             Class c = Class.forName("java.lang.Integer");    
    3.             //获取所有的属性  
    4.             Field[] fs = c.getDeclaredFields();    
    5.          
    6.             //定义可变长的字符串,用来存储属性    
    7.             StringBuffer sb = new StringBuffer();    
    8.             //通过追加的方法,将每个属性拼接到此字符串中    
    9.             //最外边的public定义    
    10.             sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{ ");    
    11.             //里边的每一个属性    
    12.             for(Field field:fs){    
    13.                 sb.append(" ");//空格    
    14.                 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等    
    15.                 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字    
    16.                 sb.append(field.getName()+"; ");//属性的名字+回车    
    17.             }    
    18.             sb.append("}");    
    19. <span style="white-space:pre">    </span>  //输出  
    20.             System.out.println(sb);    

    b、获取特定属性并赋值

    [java] view plain copy
     
    1. public static void main(String[] args) throws Exception{    
    2.                 
    3.     //以前的方式:    
    4.     /*  
    5.     User u = new User();  
    6.     u.age = 12; //set  
    7.     System.out.println(u.age); //get  
    8.     */    
    9.                 
    10.     //获取类    
    11.     Class c = Class.forName("User");    
    12.     //获取id属性    
    13.     Field idF = c.getDeclaredField("id");    
    14.     //实例化这个类赋给o    
    15.     Object o = c.newInstance();    
    16.     //打破封装    
    17.     idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。    
    18.     //给o对象的id属性赋值"110"    
    19.     idF.set(o, "110"); //set    
    20.     //get    
    21.     System.out.println(idF.get(o));    

    5、获取方法

    方法关键字

    含义

    getDeclaredMethods()

    获取所有的方法

    getReturnType()

    获得方法的放回类型

    getParameterTypes()

    获得方法的传入参数类型

    getDeclaredMethod("方法名",参数类型.class,……)

    获得特定的方法

    构造方法关键字

    含义

    getDeclaredConstructors()

    获取所有的构造方法

    getDeclaredConstructor(参数类型.class,……)

    获取特定的构造方法

    父类和父接口

    含义

    getSuperclass()

    获取某类的父类

    getInterfaces()

    获取某类实现的接口


    6、反射机制的作用

    优点:

    a、Java的反射机制就是增加程序的灵活性,避免将程序写死到代码里。
    例如: 实例化一个 person()对象, 不使用反射,需要new person(); 如果想变成实例化其他类,那么必须修改源代码,并重新编译。
          使用反射: class.forName("person").newInstance(); 而且这个类描述可以写到配置文件中,如 **.xml, 这样如果想实例化其他类,只要修改配置文件的"类描述"就可以了,不需要重新修改代码并编译。在JavaWeb中加载数据库驱动时会用到。
    b、增加程序的灵活性。
    例如:struts中。请求的派发控制。
    当请求来到时。struts通过查询配置文件。找到该请求对应的action方法。然后通过反射实例化action。并调用响应method。如果不适用反射,那么你就只能写死到代码里了。


    反射一般在框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。

    缺点:
    运用反射会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。  在项目中的业务层 规定不允许写  而且写反射 需要加大量注解

  • 相关阅读:
    笔记-归并排序
    Repeated Substring Pattern
    Assign Cookies
    Number of Boomerangs
    Paint Fence
    Path Sum III
    Valid Word Square
    Sum of Two Integers
    Find All Numbers Disappeared in an Array
    First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/shan1393/p/8996317.html
Copyright © 2011-2022 走看看