反射 枚举和lambda

1 反射(reflect) 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法. 对于任意 一个对象,都能够调用它的任意方法和属性. 既然能拿到那么,我们就可以修改部分类型信息. 这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制.
2 使用场景: 可以获取到某个类对象, 以及遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射获取到某些私有的成员或方法.
(1) Class类 代表类的实体,在运行的Java应用程序中表示类和接口 .
(2) Field类 代表类的成员变量/类的属性 .
(3) Method类 代表类的方法
(4) Constructor类 代表类的构造方法

3-1 获得Class对象的三种方式.
(1) 使用 Class.forName(“类的全路径名”), 是静态方法. 前提是 已明确类的全路径名.

 Class catClass = Class.forName("java15_0418.Cat");

(2) 使用 .class 方法. 仅适合在编译前就已经明确要操作的类.

 Class catClass2 = Cat.class;
 System.out.println(catClass == catClass2);

(3) 使用类对象的 getClass() 方法.

Cat cat = new Cat("小黑");
Class catClass3 = cat.getClass();

结论: 得到的类对象在内存中只有一份, 不管通过哪种方式获取到的类对象, 本质上都是同一个对象.所以三个都相等.
3-2 通过Class对象可以创建实例.
3-3 通过反射 获取/修改属性(可以修改 private 的属性).

package java15_0418;
class Cat {
    private String name;
    public Cat(String name) {
        this.name = name;
    }
    public void eat(String food) {
        System.out.println(this.name + " 正在吃 " + food);
    }
}

  Class catClass = Class.forName("java15_0418.Cat");
  // 通过 getDeclaredField 能得到局部内容. 通过 Field 对象来表示
  Field filed = catClass.getDeclaredField("name");
  // 这个代码加上之后, 才能访问 private 的成员
  filed.setAccessible(true);
  Cat cat = new Cat();
  filed.set(cat, "小喵喵"); //这个代码相当于cat.name="小喵喵"
  String name = (String) filed.get(cat); //这个代码相当于cat.name
  System.out.println(name);

3-4 通过反射获取到类中的方法.

  Class catClass = Class.forName("java15_0418.Cat");
  // 方法是可以重载的. 就可以通过后续的变长参数列表来指定, 要获取哪个版本的 eat.
  // 下面这个代码的意思是获取到 只有一个 参数 且类型为 String 的 eat 方法
  Method method = catClass.getMethod("eat", String.class);
  Cat cat1 = new Cat();
  method.invoke(cat1, "猫粮");

3-5 获取构造方法, 借助构造方法来实例化对象.

 Class catClass5 = Class.forName("java15_0418.Cat");
 // 获取到 Cat 类中, 只有一个参数且类型为 String 的构造方法
 Constructor constructor = catClass5.getConstructor(String.class);
 Cat cat5 = (Cat) constructor.newInstance("小黑");
 cat5.eat("鱼");

4 反射优点和缺点.
优点:(1) 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法.
(2) 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力.
(3) 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等.
缺点
(1) 我们认为反射是一个“自省”的过程,所以在性能上面有性能的问题, 一般不建议用在小型程序上,可用到框架当中.
(2) 反射技术绕过了源代码的技术,因而会带来维护问题. 反射代码比相应的直接代码更复杂 .

5 枚举: 是将一组常量组织起来.

public enum  Sex {
    MALE,
    FEMALE,
    OTHER,
}
public class TestEnum {
    public static void main(String[] args) {
        // 通过刚才定义常量来表示性别, 代码可读性是提高了, 但是对于下面的场景
        // 编译器并没有明确的约束. 按理説这个代码是无意义的, 但是编译仍然能正常编译.
          Sex sex=Sex.valueOf("MALE");
          if(sex==Sex.MALE){
              System.out.println("得到一个MALE类型的枚举常量");
        }
    }
}

6 优点: (1) 枚举常量更简单安全 . (2) 枚举具有内置方法 ,代码更优雅
缺点:不可继承,无法扩展.

7 (1) 枚举本身就是一个类,其构造方法默认为私有的,且都是默认继承与 java.lang.Enum.
(2) 枚举可以避免反射和序列化问题 .

8

热门文章

暂无图片
编程学习 ·

Qt 文件路径操作

//mSaveName = "C:/aaaa/fff.txt"; auto info = QFileInfo(mSaveName); QString pathName = info.absolutePath();// "C:/aaaa" QString baseName = info.baseName(); //"fff" QString fileName = info.fileName(); //"fff.txt"
暂无图片
编程学习 ·

使用ssh连接window和 oracle virtualBox中的虚拟机 保姆级教程

目录环境基本连接步骤进一步配置hostname环境虚拟机 VM Virtualbox 6.1 虚拟机系统 debain 10.3虚拟机网卡:1.虚拟机网卡2.主机 windows 10配置好以上环境后开始配置虚拟机,当然host-only网络适配器的ip地址可以自己设置。 基本连接步骤 第一步: 虚拟机中运行 ps -e | gr…
暂无图片
编程学习 ·

终于等到你,飞凌嵌入式i.MX6ULL核心板如约而至!

自从 2016年初,我们推出了FETMX6UL-C 核心板后,其高性价比、丰富的功能、15年生命周期、高稳定性的多方面优势,受到了广大客户的一致好评,在电力、医疗、工控、 物联网、能源管理、光伏、环境监测等领域取得大规模应用。 在此基础上, 我们推出了 FETMX6UL-C的“双胞胎兄弟…
暂无图片
编程学习 ·

javaScript之ES6

ES6新增的内容 新增的let和constlet num1 = 10console.log(num1) //10const num2 = 10console.log(num2) //10let const声明变量和 var声明变量的区别:用let 和const 声明的变量不会进行预解析,只能先声明后使用 用let 和const 不能重复声明同一个变量 用let 和const声明 变…
暂无图片
编程学习 ·

Spring Boot 整合 Redis

Redis 基于内存进行存储,支持key-value的存储形式,底层是C 基于key-value形式的数据字典,没有数据表的概念,直接用键值对的形式完成数据管理 支持五种数据类型:字符串列表集合有序集合哈希安装Redis 1.下载Redis:https://redis.io/download 2.解压并在本地硬盘人任意位置…
暂无图片
编程学习 ·

动态规划(二)

大佬的第二个视频代码 视频链接 题目一: 题目描述: 在一个数组中(只包含正整数)找出一组不相邻的数,使得其和最大 解题思路: 关键思想: 每个数有选和不选两种选择。按前i个数的最优解来说,如果选这个数,则这个数的前一个数就不能选,因此此时的最优解就是前i-2个数的最…
暂无图片
编程学习 ·

IDEA常用快捷键或修改为Eclipse快捷键风格

Ctrl + Y 删除当前行 Ctrl + D 复制当前行到下一行 Ctrl + Z 撤销 Alt+Enter 导入包,自动修正 Ctrl+F 查找文本 Ctrl+U 大小写切换 Ctrl+W 选中代码,连续按会扩大范围 Ctrl+R 替换文本快捷键改为eclipse快捷键风格Ctrl+Alt+S 或者打开File选择Settings这就完成了
暂无图片
编程学习 ·

2-Openwrt ipv6之-pppoev6客户端

pppoe拨号方式上网,ubunut服务器需要有pppoe-server也要有dhcpv6-server,路由器端需要ppp-client,也要odhcp6c指向pppoe-wan端口。1. PPPOEv6客户端启动过程pppoe拨号为wan上面的另一种方式,所以需要将uci里面的上网模式proto 改成pppoe config interface wanoption ipv6 1…
暂无图片
编程学习 ·

IT系统稳定性创新者:分布式软件,“笨马”先跑

(PerfMa CEO 李嘉鹏)早在2006年前后,IT系统稳定性就成为了当时集中式架构的挑战。随着互联网的快速兴起,当时的“Unix+小型机”架构遭遇了数据爆增的冲击。特别是在线交易、商业分析和数据库等关键业务系统,在2010年前后进入了TB甚至PB级,导致传统IT架构不堪重负,对IT系统…
暂无图片
编程学习 ·

redis集群springboot连接

谢谢参考:https://blog.csdn.net/CNZYYH/article/details/85696674一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。 定义:生产者消费者模式 :生产者生产消息放到队列里,多个消费者同时监听队列…
暂无图片
编程学习 ·

自适应核回归算法讲解

该文是对07年论文“Kernel Regression for Image Processing and Reconstruction”的总结性介绍。对于初学者来说,首先要搞明白“核回归”是什么意思。所谓“回归”可以简单地理解为对样本值的拟合。在目标函数中,通常会给不同样本值误差分配不同的权重,决定权重分配的函数即…
暂无图片
编程学习 ·

错误: 找不到或无法加载主类 Hello

打开很久不用的eclipse,运行以前写hello world程序发现报错该报错是由于项目jar包丢失导致 解决方案:右键项目 Build path Configure-----> Build path----> Libaries 查看是否有红叉,显示miss,把确实的jar包删除或者替换就行了把这些红叉的删除或者替换就行了
暂无图片
编程学习 ·

Mysql 5.7实现存在则更新,不存在则新增

需求:如果表中存在某行,那么更新即可;不存在某行,那么就新增一条。通常是将主键索引或唯一索引作为判断条件。思路:可以使用Mysql的INSERT ... ON DUPLICATE KEY UPDATE或REPLACE或UPDATE实现。如果希望一条语句实现,可以考虑前两种实现创建一张表,表中包含自增Id和唯一…
暂无图片
编程学习 ·

qqwwee/keras-yolo3 多gpu训练问题

qqwweee/keras-yolo3模型默认采用的是一块GPU,在直接使用model = multi_gpu_model(model,gpus=N)时,模型会报错tensorflow.python.framework.errors_impl.InvalidArgumentError: Can’t concatenate scalars (use tf.stack instead) for ‘yolo_loss_1/concat’ (op: ‘Conca…
暂无图片
编程学习 ·

Java并发编程之深入理解volatile

个人博客请访问 http://www.x0100.top 1. 保证可见性volatile保证了不同线程对volatile修饰变量进行操作时的可见性。对一个volatile变量的读,(任意线程)总是能看到对这个volatile变量最后的写入。一个线程修改volatile变量的值时,该变量的新值会立即刷新到主内存中,…
暂无图片
编程学习 ·

python pytest selenium 自动化测试框架搭建

python pytest selenium 自动化测试框架搭建公司一直有这个自动化测试需求,前期利用c++或者python进行了一些自动化脚本的编写。这几天没有版本更迭,基于前期的工作,把自动化测试整理了一部分功能模块。现在的状态基本达到预期:即搭建了一个AutoTest框架,基于此实现了logi…
暂无图片
编程学习 ·

linux下安装pip与pip安装

Linux安装pip 参考博客:https://www.cnblogs.com/zhongyehai/p/10619917.html 在执行脚本的时候,说有库找不到:pip安装的时候说不认识pip安装pip 使用脚本安装和升级pip wget https://bootstrap.pypa.io/get-pip.py运行脚本python3 get-pip.py查看版本pip -V如果pip -V,出现…