先安利一首专辑:
《Red》(Taylor's Version)
或许每个人都可能在二十多岁经历一段充满矛盾的情感生活,对于Taylor Swift来说,那是—种红色般炙热、鲜活的青春记忆。她曾把复杂的情感体验浇灌在第四张创作专辑《Red》中——有迷茫也有冲动,有孤独但也自由,折磨、找回自我和甜蜜并存。这是一张合人伤感,但同时也充滥着不羁情绪的专辑,从舞台摇滚、英伦摇滚、流行舞曲到
Dubstep,异彩纷呈的风格中傲然绽放着生命力,让 Taylor—举突破乡村乐的框架,走进更开阔的音乐天地。时隔九年,这张《Red》继《Fearless》之后,被Taylor选为重新录制系列的第二张专辑。
我们在《We Are Never Ever Getting Back Together》能听到游刃有余的演唱,让原曲那份青春分手宣言多了淡然和成熟。《All Too Well》曾经以细腻歌词、动人叙事获得共鸣,在重制版本中则让被粉丝期待许久的十分钟版本问世,保留滋养她的乡村乐元素同时,呈现了更完整的故事。这次,不仅Taylor 本人重新录唱,Ed Sheeran也一起合作了曲目《Everything Has Changed》和收录的未曝光作品《Run》。在这张作品发行前,Taylor曾在社交媒体分享:“在音乐和歌词上,《Red》像是一个心碎的人。“而重录不仅是音乐上的一种新生,也是多年后再次进入这些情绪,以新姿态回抚当年碎落的心。
目录
1.反射概述:
是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。
2.获取Class对象
反射使用前提是获取Class对象,获取方式有以下三种:
1.类名.class属性
2.对象名.getClass()方法
3.Class.forName(全类名)方法
具体使用:
这里以一个Student类为例:
查看三种方式获取的对象是相同的:
总结一下三种方式:
1.类名.class:JVM将使用类装载器,将类装入内存(前提是:类还没有装入内存),不做类的初始化工作,返回Class的对象。
2.Class.forName(“类名字符串”):装入类,并做类的静态初始化,返回Class的对象。
3.实例对象.getClass():对类进行静态初始化、非静态初始化;返回引用运行时真正所指的对象(子对象的引用会赋给父对象的引用变量中)所属的类的Class的对象。
3.反射获取构造方法并使用
Class类获取构造方法对象的方法
-
方法分类
方法名 说明 Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组 Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组 Constructor<T> getConstructor(Class<?>... parameterTypes) 返回单个公共构造方法对象 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象
在测试类中测试获取构造方法对象数组方法:
Student类有一个公共有参构造方法和一个私有无参构造方法:
查看运行结果
测试获取单个对象构造方法:
先创建有一个Player类:
public class Play { //成员变量:一个私有,一个默认,一个公共 private String name; int age; public String address; //构造方法:一个私有,一个默认,两个公共 public Play() { } public Play(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } private Play(String name) { this.name = name; } Play(String name, int age) { this.name = name; this.age = age; } //成员方法:一个私有,四个公共 private void function() { System.out.println("function"); } public void method1() { System.out.println("method"); } public void method2(String s) { System.out.println("method:" + s); } public String method3(String s, int i) { return s + "," + i; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", address='" + address + '\'' + '}'; } }
测试类:
查看结果:
注意:获取私有构造方式时需要使用到暴力反射。
4.反射获取成员变量并使用
Class类获取成员变量对象的方法
-
方法分类
方法名 说明 Field[] getFields() 返回所有公共成员变量对象的数组 Field[] getDeclaredFields() 返回所有成员变量对象的数组 Field getField(String name) 返回单个公共成员变量对象 Field getDeclaredField(String name) 返回单个成员变量对象
获取成员变量对象的数组测试类:
查看结果
获取单个成员变量测试:
查看运行结果
5.反射获取成员方法并使用
Class类获取成员方法对象的方法
-
方法分类
方法名 说明 Method[] getMethods() 返回所有公共成员方法对象的数组,包括继承的 Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承的 Method getMethod(String name, Class<?>... parameterTypes) 返回单个公共成员方法对象 Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回单个成员方法对象
获取成员方法对象数组测试类:
运行结果
获取单个成员方法并使用:
运行结果: