zoukankan      html  css  js  c++  java
  • Java之反射

    反射就是把Java类中的各种成分映射成一个个的java对象。


    1.Java反射常用类

    Class类—可获取类和类的成员信息 
    Field类—可访问类的属性  
    Method类—可调用类的方法 
    Constructor类—可调用类的构造方法
    

    2.如何使用反射

    1.导入java.lang.reflect.* 
    
    2.获得需要操作的类的Java.lang.Class对象 
    
    3.调用Class的方法获取Field、Method等对象 
    
    4.使用反射API进行操作 (设置属性﹑调用方法)
    

    3.Class类

    1)Class类是Java 反射机制的起源和入口

    每个类都有自己的Class 对象且每一个类只有一个class 对象
    用于获取与类相关的各种信息
    提供了获取类信息的相关方法
    Class类继承自Object类
    

    2)Class类存放类的结构信息

    这里写图片描述

    3)【类对象】获取类的Class 对象

    方法1:对象.getClass()
        Person person = new Person();
    Class class2 = person.getClass();
    
    方法2:类.class
        Class class1 = Person.class;
    
    方法3:Class.forName()
        Class class3 = Class.forName("com.qf.demo.Person");
        使用forname方法,参数为相对于本工程的Person类文件路径
    

    4)【属性】获取Field 对象

    【只能获取public的属性】Field[] fields = class1.getFields();
    【获取所有属性】Field[] fields2 =  class1.getDeclaredFields();
    

    public属性

        【得到指定的属性对象】Field field = class1.getField("age");
        【 给属性赋值】field.set(object, 5);
        【得到属性值,返回的是对象】Object object2 = field.get(object);
    

    静态属性

        【获取属性对象】Field field2 = class1.getDeclaredField("weight");
        【属性赋值】field2.set(null, 10);
        【获取属性值】Object object3 = field2.get(null);
    

    私有属性

        Field  field3 = class1.getDeclaredField("name");
        【设置权限】field3.setAccessible(true);
        field3.set(object, "小花");
        Object object4 = field3.get(object);
    

    5)【方法】获取Method 对象

    --Method[] methods = class1.getMethods();// 得到【本类和父类】的【非私有】的方法
    
    --Method[] methods2 = class1.getDeclaredMethods();// 得到【本类】中声明的所有的方法【包括私有】
    
    --【得到无参无返回值方法】Method method = class1.getMethod("eat", null);
    【方法调用】method.invoke(object, null);// 参数1:对象;参数2:方法参数
    
    --【得到有参无返回值方法】Method method2 = class1.getMethod("drink", String.class);
    【方法调用】method2.invoke(object, "水");
    
    --【得到无参有返回值方法】Method method3 = class1.getMethod("sleep", null);
    【调用】Object  object2 = method3.invoke(object, null);//返回值都是用对象接收
    
    --【静态方法】Method method4 = class1.getMethod("hehe", null);
    【调用,不需要传对象】method4.invoke(null, null); 
    
    --【私有方法】Method method5 = class1.getDeclaredMethod("play", null);
    【必须设置访问权限】method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限
    【调用】method5.invoke(object, null);
    

    6)【构造方法】获取Constructor对象

    【获取所有构造方法】Constructor[] constructors = class1.getConstructors();
    
    【得到无参的构造方法】Constructor constructor = class1.getConstructor(null);
    【创建对象】Person person = (Person) constructor.newInstance(null);
    
    【得到有参的构造方法】Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
    【创建对象】Person person2 = (Person) constructor2.newInstance("张三",5,9);
    

    4.反射优缺点

    优点

        1 提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力
        2 允许程序创建和控制任何类的对象,无需提前硬编码目标类
    

    缺点

        性能问题
        代码维护问题
        可以使用私有的属性和方法,破坏了代码块的安全性
    
  • 相关阅读:
    [HAOI2015]树上操作(树链剖分)
    树链剖分——解决树上路径问题利器
    [CodeForces 833B] The Bakery(数据结构优化dp)
    [国家集训队]最长双回文串(马拉车)
    [国家集训队]拉拉队排练(Manacher)
    【ATcoder】AtCoder Beginner Contest 159 题解
    蒟蒻的数列[BZOJ4636](线段树)
    Manacher马拉车算法——解决最长回文子串问题
    HDU 1501 Zipper (记忆化搜索)
    HDU 1428 漫步校园 (dfs+记忆化搜索dfs)
  • 原文地址:https://www.cnblogs.com/TCB-Java/p/6853997.html
Copyright © 2011-2022 走看看