zoukankan      html  css  js  c++  java
  • 菜鸟学Java(十四)——Java反射机制(一)

    说到反射,相信有过编程经验的人都不会陌生。反射机制让Java变得更加的灵活。反射机制在Java的众多特性中是非常重要的一个。下面就让我们一点一点了解它是怎么一回事。


    什么是反射

    在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。


    反射有什么用

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

    2,在运行时构造任意一个类的对象;

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

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

    5,生成动态代理。


    反射的API

    学习一门语言,一种比较好的方式就是看它的API文档,因为它的API是最权威的,最准确的。下面我们一起看看JDK的API对于反射是如何描述的吧!


    与反射有关的所有接口以及类都在java.lang.reflect包里。


    接口

    接口摘要

    AnnotatedElement

    表示目前正在此 VM 中运行的程序的一个已注释元素。

    GenericArrayType

    GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量。

    GenericDeclaration

    声明类型变量的所有实体的公共接口。

    InvocationHandler

    InvocationHandler 是代理实例的调用处理程序 实现的接口。

    Member

    成员是一种接口,反映有关单个成员(字段或方法)或构造方法的标识信息。

    ParameterizedType

    ParameterizedType 表示参数化类型,如 Collection<String>。

    Type

    Type 是 Java 编程语言中所有类型的公共高级接口。

    TypeVariable<D extends GenericDeclaration>

    TypeVariable 是各种类型变量的公共高级接口。

    WildcardType

    WildcardType 表示一个通配符类型表达式,如 ?、? extends Number 或 ? super Integer。


    类摘要

    AccessibleObject

    AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。

    Array

    Array 类提供了动态创建和访问 Java 数组的方法。

    Constructor<T>

    Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。

    Field

    Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。

    Method

    Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。

    Modifier

    Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。

    Proxy

    Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。

    ReflectPermission

    反射操作的 Permission 类。



    下面给大家写了一个小实例:

    package reflection;
    
    public class UserInfo {
        
        private Integer id;
        private String userName;
        private String password;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        
        @Override
        public String toString(){
            return this.getClass().getName();
        }
        
    }
    package reflection;
    
    public class GetClass {
    
        public boolean ClassCheck(){
            try {
                
                System.out.println("第一种,通过类本身获得对象");
                Class UserClass = this.getClass();
                System.out.println("第一种方式成功!类名:"+UserClass.toString()+"
    ");
                
                System.out.println("第二种,通过子类实例获取父类");
                UserInfo ui = new UserInfo();
                UserClass = ui.getClass();
                Class SubUserClass = UserClass.getSuperclass();
                System.out.println("第二种方式成功!类名:"+SubUserClass.toString()+"
    ");
                
                System.out.println("第三种,通过类名加.class获得对象");
                Class ForClass = reflection.UserInfo.class;
                System.out.println("第三种方式成功!类名:"+ForClass.toString()+"
    ");
                
                System.out.println("第四种,通过类名的字符串获得对象");
                Class ForName = Class.forName("reflection.UserInfo");
                System.out.println("第四种方式成功!类名:"+ForName.toString()+"
    ");
                
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
        
        @Override
        public String toString(){
            return this.getClass().getName();
        }
        
        public static void main(String[] args) {
            GetClass gc = new GetClass();
            gc.ClassCheck();
            if (gc.ClassCheck()) {
                System.out.println("所有反射全部成功!");
            }
            else {
                System.out.println("反射有问题,请检查!");
            }
        }
    
    }

    上面四种方法里面,我用的最多的是第四种,这种一般都是配合配置文件一起用的。反射与配置文件的结合让我们的代码变得非常的灵活,易扩展、以维护。可谓是好处多多呀,所以才有那句”反射反射,程序员的快乐!“一起尽情的快乐吧!


    PS:下一篇将结合实例更加详细的讲解!《菜鸟学编程(十)——Java反射机制(二)》

  • 相关阅读:
    testing
    mysql的collation
    使用elk+redis搭建nginx日志分析平台
    安装logstash,elasticsearch,kibana三件套
    技术晨读_2014_12_22
    laravel中的错误与日志
    maven仓库--私服(Nexus的配置使用)
    Youtube的论文《Deep Neural Networks for YouTube Recommendations》
    2018中国区块链应用生态发展报告
    阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) ,阿里百万级QPS资源调度系统,一般的服务器qps多少? QPS/TPS/并发量/系统吞吐量
  • 原文地址:https://www.cnblogs.com/liushuijinger/p/3411244.html
Copyright © 2011-2022 走看看