zoukankan      html  css  js  c++  java
  • 反射

    主要说两点1.什么是反射2.反射的应用场景
    1:什么是反射
    在类加载到内存中的时候,要将编译后的.class文件读入内存,并由Class类为之创建Class对象
    在内存中一个类只有一个Class对象产生
    所谓反射就是可以通过类获取该类的所有属性和方法
    类加载的过程:
    当我们new Stu()时候,jvm会加载我们的stu.class
    jvm会去本地磁盘上找到stu.class文件,并加载到jvm内存中
    这时jvm会自动创建一个Class对象,并且一个类只会创建一个
    反射就是通过这个Class对象反向获取这个类的各种信息
    获取Class对象的三种方式:

     1 public class Demo1_Reflect {
     2     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
     3         //第一种
     4         Class clazz1 = Class.forName("cn.alibaba.spq.Person");
     5         //第二种
     6         Person per = new Person();  
     7         Class perClass = per.getClass();
     8         //第三种
     9         Class persClass = Person.class; 
    10     }
    11 }


    在Class类的api中可以查看到各种方法:
    常用如下:

     1 public class Demo1_Reflect {
     2     public static void main(String[] args) throws Exception {
     3         //第一种
     4         Class clazz1 = Class.forName("cn.alibaba.spq.Person");
     5         //获取构造方法
     6         Constructor[] arrcon = clazz1.getDeclaredConstructors();
     7         for (Constructor c : arrcon) {
     8             System.out.println(c);
     9         }
    10         //获取属性
    11         System.out.println("---------");
    12         Field[] fields = clazz1.getDeclaredFields(); 
    13         for (Field field : fields) {
    14             System.out.println(field);
    15         }
    16         //获取方法
    17         System.out.println("---------");
    18         Method[] merArr = clazz1.getDeclaredMethods();
    19         for (Method method : merArr) {
    20             System.out.println(method);
    21         }
    22     }
    23 }

    2.反射的应用场景

    在获取Class对象上常用第一种方式,因为只需要传入String,这样我们就可以把String写在配置文件中,然后采用获取配置文件的方式进行加载,如下:

    1 BufferedReader br = new BufferedReader(newFileReader("xxx.properties"));    //创建输入流关联xxx.properties
    2 Class clazz = Class.forName(br.readLine());                                    //读取配置文件中类名,获取字节码对象

    其实这种方式在Spring中用到最多,经典的就是在xml文件或者properties里面写好了配置,然后在Java类里面解析xml或properties里面的内容,得到一个字符串,然后用反射机制,根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去new或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了

  • 相关阅读:
    51nod 1621 花钱买车牌 优先队列
    最大字段和 51nod 1049 水水水水水水水水水水水水
    大数相乘 51nod 1027 水题
    逆序数 51nod 1019 归并 分治
    最长公共子序列 LCS 递归 dp 51Nod 1006
    vc6 字体设置
    自行车维护大全(zz)
    DirectX 9.0 3D游戏开发编程基础 [书评](zz)
    二维线段树
    latex 引用文献 bib
  • 原文地址:https://www.cnblogs.com/jaro/p/8975088.html
Copyright © 2011-2022 走看看