目录

  • 反射
    • 定义
      • 反射起源
      • 反射相关的类
    • 获得Class类的对象
    • 创建对象
    • 反射私有的构造方法
    • 反射私有的成员变量
    • 反射私有的方法

反射

定义

反射机制是在运行状态中,对于任何一个类可以知道其所有的属性和方法(包括私有的),对于任何一个对象可以调用其所有的属性和方法(包括私有的),同时可以修改部分类型信息

反射起源

反射相关的类

类名 用途
Class 代表类的实体
Field 代表类的成员变量
Method 代表类的方法
Constructor 代表类的构造方法
class Person{private String name = "James";public int age = 36;public Person() {this.name = "Kobe";this.age = 41;}private Person(String name, int age) {this.name = name;this.age = age;}private void BasketBall(){System.out.println("Rusall Westbrook");}public void Swimming(){System.out.println("Sun Yang");}private void FootBall(String str){System.out.println(str);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

获得Class类的对象

  • Class.forName("类的全路径名 (包名.类名) ")
    forName()是Class类的静态方法,此方法可能会抛出异常
  • 每一个类都有一个隐含的静态成员变量.class
  • 使用类的普通方法getClass()(继承自Object)
    先new一个类的对象,再调用getClass()方法
  • 一个类只能对应一个Class类对象
    public static void main(String[] args) {//1. Class c1 = null;try{c1 = Class.forName("Reflect.Person");}catch (ClassNotFoundException e) {e.printStackTrace();}//2.Class c2 = Person.class;//3.Person person = new Person();Class c3 = person.getClass();System.out.println(c1 == c2);   //trueSystem.out.println(c2 == c3);   //true}

创建对象

    public static void reflectnewInstance() throws ClassNotFoundException, IllegalAccessException, InstantiationException {Class c = Class.forName("Reflect.Person");//调用Person的无参数构造方法,私有不可以(非私有的都可以)Person person = (Person) c.newInstance();System.out.println(person);  //Kobe 41}

反射私有的构造方法

getDeclaredConstructor(参数类型…)

方法 用法
Constructor getConstructor(Class…<?> types) 获取参数对应的公有构造方法
Constructor getDeclaredConstructor(Class…<?> types) 获取参数对应的构造方法(公有、私有都可以哦)
Constructor[ ] getConstructors() 获取该类的所有的公有构造方法
Constructor[ ] getDeclaredConstructors() 获取该类所有的构造方法
    public static void re_Pri_Con() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Class c = Class.forName("Reflect.Person");//通过参数,指定返回某个特定的私有构造方法Constructor constructor = c.getDeclaredConstructor(String.class,int.class);//设置权限constructor.setAccessible(true);//调用指定的构造方法Person person = (Person) constructor.newInstance("强爷",18);System.out.println(person); //强爷 18}
    public static void re_Pub_Con() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Class c = Class.forName("Reflect.Person");Constructor constructor = c.getConstructor();constructor.setAccessible(true);Person person = (Person)constructor.newInstance();System.out.println(person);  //Kebo 41}

反射私有的成员变量

getDeclaredField(“指定成员变量的名字”)
field.set(类的对象,修改的成员变量的内容);

方法
Field getField(String name) 获取对应的公有成员变量
Field getDeclaredField(String name) 获取对应的成员变量(公有、私有)
Field[ ] getFields() 获取所有的公有成员变量
Field[ ] getDeclaredFields() 获取所有的成员变量
    public static void re_Pri_Field() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {Class c = Class.forName("Reflect.Person");Person person = (Person) c.newInstance();//getDeclareField()的参数是需要获取的私有变量的名字Field field = c.getDeclaredField("name");field.setAccessible(true);//修改对象的私有变量field.set(person,"Durant");System.out.println(person);  //Durant 41String str = (String) field.get(person);System.out.println("将私有属性修改为" + str);}

反射私有的方法

getDeclaredMethod(“指定方法的名字”,参数类型…)
invoke(类的对象,传入的参数)

方法
Method getMethod(String name, Class…<?> types) 获取指定的公有方法
Method getDeclaredMethod(String name, Class…<?> types) 获取指定的方法(公有、私有)
Method[ ] getMethods() 获取所有的公有方法
Method[ ] getDeclaredMethods() 获取所有的方法
    public static void re_Pri_Method() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {Class c = Class.forName("Reflect.Person");Person person = (Person) c.newInstance();Method method = c.getDeclaredMethod("FootBall", String.class);method.setAccessible(true);method.invoke(person,"罗那尔多");}

反射的优点:

  • 对于任何一个类,可以直到它所有的属性和方法;对于任何一个对象可以调用它所有的属性和方法
  • 增减程序的灵活性
  • 反射已经应用于多个框架,Struts、Spring等

缺点

  • 使用反射导致程序效率降低
  • 反射绕过了源代码的技术,会带来维护问题

祝贺EDG3:2战胜DK登顶世界之巅
银龙重铸之日,骑士归来之时
重铸LPL荣光,我辈义不容辞

妖怪,看法宝-看反射的“照妖镜”如何让类原形毕露相关推荐

  1. 论文解读 | 微信看一看实时Look-alike推荐算法

    作者丨gongyouliu 编辑丨lily 来源 | 授权转载自大数据与人工智能(ID:ai-big-data) 微信看一看的精选文章推荐(见下面图1)大家应该都用过,微信团队在今年发表了一篇文章来专 ...

  2. Scrum模拟微信看一看“疫情专区”的敏捷开发过程

    无论作为产品用户还是管理咨询顾问,都非常非常喜欢微信.自认感情比较克制属于"高冷"挂,但从很多方面都太佩服太崇拜张小龙了(新书里微信也会是最喜欢的案例之一,真的不只是一个产品而已, ...

  3. 第一款鸿蒙摄像头,随时随地看一看!华为首款鸿蒙智能摄像头发布

    原标题:随时随地看一看!华为首款鸿蒙智能摄像头发布 当我们进入科技飞速发展的时代,越来越多的角落开始布控了一些摄像装置.截止到如今,不仅仅在一些公共死角位置安排了电子猫眼,一些养了宠物的年轻人也在家中 ...

  4. 深度学习核心技术精讲100篇(四十)-微信“看一看“内容理解与推荐,背后深层次的技术知多少?

    前言 相信对于不少人而言微信已经成为获取资讯的主要场景.与此同时,由于微信用户群体的庞大,也吸引了大量的内容生产者在微信公众平台创造内容,以获取用户关注.点赞.收藏等.微信内的内容推荐产品:看一看应运 ...

  5. 特斯拉马斯克直聘AI人才:不看学历看能力

    特斯拉马斯克直聘AI人才:不看学历看能力 火,大火,太火了. 这就是特斯拉2020年以来的股价趋势.在最新一轮暴涨后,马斯克都忍不住祭出"大火"表情包,庆祝市值创下新高--1400 ...

  6. php关键词分词搜索 最多匹配的排在最前面_百度搜索引擎工作原理,做Seo的建议看一看 - 蜘蛛池博客...

    原出处:蜘蛛池博客 原文链接:百度搜索引擎工作原理,做Seo的建议看一看 - 蜘蛛池博客 从事SEO(搜索引擎优化)工作的人可以比喻成搜索引擎的贴身管家,作为一名合格称职的管家必须要了解所服务对象的习 ...

  7. 揭秘微信「看一看」如何精准挖掘你感兴趣的内容

    作者:maricoliao,腾讯 WXG 应用研究员 一.背景 随着自媒体时代的蓬勃发展,各类自媒体平台每天涌现出海量信息.微信作为最优质的自媒体平台,每天新发表文章数百万篇.汹涌而来的信息,极大地丰 ...

  8. 20岁以后的男人应该知道的一些事,看一看吧

    酒吧认识的女人,多半就没有必要再留电话了. 2喝酒喝好,不代表喝完吐吐完喝,在量上占个老 3告别网恋吧,相比之下家人介绍的对象还是可以看看,必竟知根知底比较把握,少走弯路. 4周末有带情人泡午夜场的钱 ...

  9. 微信看一看实时相关推荐介绍

    作者:谢若冰,腾讯微信研究员 在推荐系统中,用户在一个时间段经常会关注同一个主题.当用户读完一篇文章时,他往往会想要继续阅读和这篇文章相关的拓展文章.然而,传统的推荐系统feed流难以提供这种深度的拓 ...

最新文章

  1. linux进程间通信:命名管道FIFO
  2. 执行远程linux命令,linux shell 远程执行命令
  3. Vivado IP的两种综合方式:Global 和 Out-Of-Context
  4. 从C语言的角度重构数据结构系列(七)-数据结构堆知识求解数据流中的第K大元素
  5. 【项目管理】工件清单说明
  6. ubuntu 拷贝文件
  7. UI自动化之元素定位(xpath、css)
  8. MaintainableCSS 《可维护性 CSS》 --- 模板篇
  9. 基于matlab的升压斩波实验,升降压斩波电路matlab仿真
  10. Java初级笔记-第一章
  11. 敏捷开发免费管理工具——火星人预览之五:常见问题问答
  12. 趋势 | 2020年云计算的10大市场方向
  13. BZOJ 1632: [Usaco2007 Feb]Lilypad Pond
  14. Java中常见的服务器
  15. MYSQL选修课的心得体会_选修课心得体会
  16. 医院私有云架构统一灾备中心建设最佳实践
  17. 37_Flutter之Sliver组件扩展
  18. Intel® oneAPI Base Toolkit+Intel® oneAPI HPC Toolkit安装教程
  19. 详解border-radius属性
  20. 纯净版windows8安装包下载

热门文章

  1. 从零开始山寨Caffe·伍:Protocol Buffer简易指南
  2. android手机联调,Android第三课 联调华为手机
  3. 物联网驱动数字化转型
  4. SendMessage功能(中规中矩)
  5. WAIC直击:商汤科技展示AI应用落地最新成果
  6. Python将经纬度数据转换成浮点数据
  7. 操作系统——PV操作
  8. Android百度语音集成——文字转语音
  9. win7系统安装 wifi连接到服务器,win7系统笔记本wifi无法连接到服务器1237的解决方法...
  10. Android开发随手记1