zoukankan      html  css  js  c++  java
  • 反射机制(reflection)动态相关机制

    功能:动态获取类的信息以及动态调用对象的方法。

    Java反射机制主要提供了以下功能:

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

    2.在运行时构造任意一个类的对象。

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

    4.在运行时调用任意一个对象的方法。

    这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息。

    包括其modifiers(诸如public、static等)、 superclass(例如Object)、实现了的 interfaces (例如Serializable)、也包括其fields(类的属性)和methods(类的方法)的所有信息,并可于运行时改变fields内容或调用methods。

    Class c1=Class.forName("com.xsl.entity.Student");

    System.out.println(c1.getName());          //com.xsl.entity.Student

    System.out.println(c1.getSimpleName());      //Student

    System.out.println(c1.gerSuperClass());      //class java.lang.object

    import java.lang.reflect.Method;

    public class DumpMethods
    {
      public static void main(String[] args) throws Exception
    {
      //获得字符串所标识的类的class对象
      Class<?> classType = Class.forName("java.lang.String");//在此处传入字符串指定类名,所以参数获取可以是一个运行期的行为,可以用args[0]
      //返回class对象所对应的类或接口中,所声明的所有方法的数组(包括私有方法)
      Method[] methods = classType.getDeclaredMethods();
      //遍历输出所有方法声明
      for(Method method : methods)
      {
        System.out.println(method);
      }
    }

    }

    获取Class类型的对象的4种方式

    //1、及时加载方式

    Class c = Class.forName("...");

    类名 变量名 = (类名)c.newInstance();  //实例化

    //2、延时加载方式

    Class c = 类名.class;

    类名 变量名 = (类名)c.newInstance();  //实例化

    //3、通过对象来获取

    Class c = new 类名().getClass();

    类名 变量名 = (类名)c.newInstance();  //实例化

    //4、通过类加载器来加载

    ClassLoad loader = ClassLoader.getSystemClass();

    Class c = loader.loadClass("...");

    类名 变量名 =(类名) c.newInstance();  //实例化

    生成对象的两种方法

    1、先获得Class对象,然后通过该Class对象的newInstance()方法直接生成。(上面都是采用这种方法生成的) 

    2、先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成。

    Class<?> classType = Student.class;

    // 获得Constructor对象,此处获取第一个无参数的构造方法的
    Constructor cons = classType.getConstructor(new Class[] {});

    // 通过构造方法来生成一个对象
    Object obj = cons.newInstance(new Object[] {});

    获取类加载器:系统(应用程序)加载器(AppClassLoader)、扩展加载器(ExtClassLoader)、根加载器

    如:

    Class c1 = Class.forName("...");

    System.out.println(c1.getClassLoader());              //...AppClassLoader...应用程序加载器  加载当前项目路径或类路径中自定义类型

    System.out.println(c1.getClassLoader().getParent());        //...ExtClassLoader...扩展加载器  E:JDK1.8jrelibext

    System.out.println(c1.getClassLoader().getParent().getParent());  //null  根加载器

    加载原则、向上委托原则、一致性原则、向上透明性原则

    网络加载器(属于扩展加载器)

    URL [] urls = {new URL("http://localhost:8080/textpro/love.jar")};

    URLClassLoader loader = new URLClassLoader(urls);

    Class c = loader.loadClass("com.xsl.entity.Student");

    Student s = (Student)c.newInstance();

    优先本地

    利用反射调用私有方法、访问私有属性

    首先是Class对象的获取,之后是Method和Field对象的获取。

      以Method为例:

      getMethod()方法返回的是public的Method对象,

      而getDeclaredMethod()返回的Method对象可以是非public的。

      Field的方法同理。

    可参考http://www.cnblogs.com/mengdd/archive/2013/01/26/2878136.html

  • 相关阅读:
    Oracle instr() 字符查找函数
    Oracle 中触发器增加存储过程commit问题
    Oracle 记录下jdbc thin client module名称
    sqoop job 实现自动增量导入
    Linux LVM--三种Logic Volume
    Kafka ISR and AR HW 、 LEO
    Kafka Rebalance机制分析
    Kafka 基础操作
    Kafka 通过python简单的生产消费实现
    Kafka为什么速度那么快?该怎么回答
  • 原文地址:https://www.cnblogs.com/xsl1995/p/6277962.html
Copyright © 2011-2022 走看看