zoukankan      html  css  js  c++  java
  • 【java每日一学】java的反射机制

    反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,并可于运行时改变fields内容或调用methods。

    Class(类对象)  ----java.lang.Class

    可以通过三种方式获取一个类的类对象

    1.已知一个对象实例(instance)想获取其类对象的情况

    Class class = ${instance}.getClass();

    2.已知类获取其类对象的情况

    Class class = ${Class}.class;

    3.已知类名获取其类对象的情况(可能抛出ClassNotFoundException)

    Class class = Class.forName('${类名}');

    用这种方法获取类对象需要使用类的全名,即"包名.类名",而且不能使用单引号.

     正确的写法如下

    这三种方式获取的类对象如果是同一个类,equals方法的结果是true

    Class对象的Api:

      getName():获得类的完整名字。

      getFields():获得类的public类型的属性。

      getDeclaredFields():获得类的所有属性。包括private 声明的和继承类

      getMethods():获得类的public类型的方法。

      getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类

      getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。

    这里出现警告的原因是:Class本身是一个带有泛型的类,即原本的写法是Class<?>,当没有明确指定泛型的类型时,java无法根据泛型进行类型检查。


      getConstructors():获得类的public类型的构造方法。

      getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。

    出现警告的原因跟上述getMethod一样,也是没有指定泛型所导致的。实际编码中可以使用@SuppressWarnings("unchecked")来压制未检查警告。

      newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

     这里出现了一个异常:Integer类型无法通过newInstance来构造实例,是不是因为其没有不带参数的构造方法呢,查阅api文档:

    果然,如果一个类没有默认构造方法(无参构造方法),则会导致实例化失败。并抛出InstantiationException异常.

    如果想带有参数的构造实例,则应该使用${constructor}.newInstance()方法,如下图,来自https://www.cnblogs.com/duanweishi/p/4480163.html

    上面方法中涉及的类型有:Field、Method、Constructor 都是java.lang.reflect包中的类。分别表示类的属性、类的方法、类的构造方法。

    可以使用${class}.getSuperclass()来获取某个类对象的父类对象

  • 相关阅读:
    Laravel5.0学习--03 Artisan命令
    yar框架使用笔记
    MySQL外键之级联
    笛卡尔积
    PHP钩子机制
    CentOS安装PHP7+Nginx+MySQL
    Linux压缩命令
    Git命令汇总
    使用List把一个长字符串分解成若干个短字符串
    Adb connection Error:远程主机强迫关闭了一个现有的连接
  • 原文地址:https://www.cnblogs.com/linyueshaoxia/p/13997626.html
Copyright © 2011-2022 走看看