zoukankan      html  css  js  c++  java
  • Java的反射(一)

    反射多用于 JDBC 中的加载驱动程序 Class.forName("com.mysql.jdbc.Driver");Struts 的 MVC、Hibernate 中的 ORM、Spring 中的 IOC 还有一些其他框架等等。那它有什么好处呢?它的好处就是能够动态的创建对象和编译且能够访问某个类中的所有(包括私有)属性方法及对象的属性方法并进行调用,比较灵活,这样也有利于降低类间的耦合度;但反射也有缺点,就是破坏了类的封装性和对象的完整性。
         一、Class 类:
          1、对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class类型的对象。一个 Class 对象包含了特定某个类的有关信息。
        2、Class 对象只能由系统建立对象
       3、一个类在 JVM 中只会有一个 Class 实例,每个类的实例都会记得自己是由哪个 Class 实例所生成
       4、获取 Class 对象的方式: 
           Class c1=null;
     
        (1)通过类的 class 属性获取,这种方法最可靠、程序性能更高
              类名.class
               c1=Person.class;
       (2)通过对象调用 getClass()方法获取
               Object obj=new Person();
                c1=obj.getClass();
        (3)通过全类名来获取(用的较多)
                String className=“com.info.Person”;
                c1=Class.forName(className);
     
    5、Class 类的常用方法:
           static Class forName(String name) 返回指定类名 name 的 Class 对象
          Object newInstance() 调用缺省构造函数,返回该 Class 对象的一个实例
         Object newInstance(Object []args) 调用当前格式构造函数,返回该 Class 对象的一个 实例
         getName() 返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称
        Class getSuperClass() 返回当前 Class 对象的父类的 Class 对象
        Class [] getInterfaces() 获取当前 Class 对象的接口
        ClassLoader getClassLoader() 返回该类的类加载器
        Class getSuperclass() 返回表示此 Class 所表示的实体的超类的 Class

     
    示例:
           Object newInstance()方法的使用:
            Class c2=null;
            c2=Class.forName("com.info.Person");
            Object obj=c2.newInstance();//调用类的无参的构造器
            System.out.println(obj);
    【注意】在定义类时一定要 声明 无参的构造器, 给反射使用 
     
    二、 ClassLoader
                类加载器是用来把类 (class) 装载进 JVM 的。 JVM 规范定义了两种类型的类 加 载器:启动类加载器 (bootstrap) 和用户自定义加载器 (user- - defined class loader) 。JVM 在运行时会产生 3 3 个类加载器组成的初始化加载器层次结构 ,如下图所示:

    示例:
         1、获取一个系统的类加载器
              ClassLoader loader=ClassLoader.getSystemClassLoader();
              System.out.println(loader);
         2、获取系统类加载器的父类加载器
              loader=loader.getParent();
               System.out.println(loader);
         3、测试当前类是由哪个类加载器加载的:
              loader=Class.forName("com.info.TestClass").getClassLoader();
             System.out.println(loader);
      Reflection (反射)是Java 被视 为动态语言的关键,反射机制允许程序在执行期借
    助于Reflection API 取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。

     
    Java 反射机制主要提供了以下功能:
       (1)在运行时构造任意一个类的对象
       (2)在运行时获取任意一个类所具有的成员变量和方法
       (3)在运行时调用任意一个对象的方法(属性)
       (4)生成动态代理
  • 相关阅读:
    luogu 1593
    luogu 1369
    hdu 1796
    bzoj 3398
    luogu 4587
    luogu 2152
    bzoj 3629
    bzoj 1507: [NOI2003]Editor
    bzoj 1503: [NOI2004]郁闷的出纳员
    bzoj 1497: [NOI2006]最大获利
  • 原文地址:https://www.cnblogs.com/lone5wolf/p/10856120.html
Copyright © 2011-2022 走看看