zoukankan      html  css  js  c++  java
  • java反射1

    反射:通过Class实例获取class信息的方法称为反射(Reflection)
    获取class的class实例
    方法一:通过一个class的静态变量class获取
    Class 变量名=String.class
    方法二:通过实例提供的getClass()获得
    Class 变量名=实例.getClass()
    方法三:如果知道一个class的完整类名,可以通过静态方法class.forName()
    Class 变量名=Class.forName(类名字符串)

    Class实例在JVM是唯一的因此可以用==比较两个Class实例
    Class比较与instanceof区别用instanceof不但匹配指定类型,还匹配指定类型的子类。
    而用==判断class实例可以精确地判断数据类型,但不能作子类型比较

    打印Class实例信息:
    static void printClassInfo(Class cls) {
    System.out.println("Class name: " + cls.getName());
    System.out.println("Simple name: " + cls.getSimpleName());
    if (cls.getPackage() != null) {
    System.out.println("Package name: " + cls.getPackage().getName());
    }
    System.out.println("is interface: " + cls.isInterface());
    System.out.println("is enum: " + cls.isEnum());
    System.out.println("is array: " + cls.isArray());
    System.out.println("is primitive: " + cls.isPrimitive());
    }

    使用Class实例创建对应类型实例 它的局限是:只能调用public的无参数构造方法。带参数的构造方法,或者非public的构造方法都无法通过Class.newInstance()被调用
    // 获取String的Class实例:
    Class cls = String.class;
    // 创建一个String实例:
    String s = (String) cls.newInstance()

    通过Class实例访问字段
    Class实例.getField(字段名称字符串可选):根据字段名获取某个public的字段(包括父类)
    Class实例.getDeclaredField(字段名称字符串可选):根据字段名获取当前类的某个public的字段(不包括父类)
    一个Field对象包含一个字段的所有信息如:
    Field.getName():返回字段名称,例如,"name";
    Field.getType():返回字段类型,也是一个Class实例,例如,String.class;
    Field.getModifiers():返回字段的修饰符,它是一个int,不同的bit表示不同的含义
    Field.get(指定实例): 获取指定实例的指定字段的值(无法访问private)
    Field.set(指定实例,修改的值)

    通过Class实例访问方法
    Class实例.getMethod(方法名,方法的类型Class) 若方法是返回String String.class 获取某个public的Method(包括父类)
    Class实例.getDeclaredMethod(name, Class...):获取当前类的某个方法(不包括父类)

    一个Method对象包含一个方法的所有信息:
    getName():返回方法名称,例如:"getScore";
    getReturnType():返回方法返回值类型,也是一个Class实例,例如:String.class;
    getParameterTypes():返回方法的参数类型,是一个Class数组,例如:{String.class, int.class};
    getModifiers():返回方法的修饰符,它是一个int,不同的bit表示不同的含义。

    Method对象.invoke(指定实例,参数) 若是调用一个静态方法指定实例永远为null
    反射方法 遵从多态原则

    通过Class实例调用方法
    Class实例.getConstructor(Class...) 获取某个public的Constructor(构造方法)
    Class实例.getDeclaredConstructor(Class...):获取某个Constructor;
    Constructor实例.newInstance(构造参数);调用构造方法

  • 相关阅读:
    解决.Net 4.0 A potentially dangerous Request.Form value was detected from the client 异常
    解决背景在360极速模式下不显示的问题
    ASP怎么解除文件上传200kb限制
    mysql导入数据出错
    ECShop出现Strict Standards: Only variables should be passed by reference in的解决方法
    phpmyadmin导入sql数据的纠结
    Veket_Porteus_Puppy安装器by双心
    多系统的福音,bcdedit找回传统启动菜单。取消(恢复)Modern UI风格启动菜单~菜单~
    关于fbinst-ud区的几点看法
    高速公路坐标高程计算软件4.2版本发布
  • 原文地址:https://www.cnblogs.com/frlblog/p/13025428.html
Copyright © 2011-2022 走看看