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()来获取某个类对象的父类对象

  • 相关阅读:
    《C# to IL》第一章 IL入门
    multiple users to one ec2 instance setup
    Route53 health check与 Cloudwatch alarm 没法绑定
    rsync aws ec2 pem
    通过jvm 查看死锁
    wait, notify 使用清晰讲解
    for aws associate exam
    docker 容器不能联网
    本地运行aws lambda credential 配置 (missing credential config error)
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
  • 原文地址:https://www.cnblogs.com/linyueshaoxia/p/13997626.html
Copyright © 2011-2022 走看看