网站域名的设置,厚街网站建设,四川省住房与城乡建设厅网站,codeus wordpress一.反射
1.概念#xff1a;Java的反射#xff08;reflection#xff09;机制是在运行状态中#xff0c;对于任意一个类#xff0c;都能够知道这个类的所有属性和方法#xff1b;对于任意一个对象#xff0c;都能够调用它的任意方法和属性#xff0c;既然能拿到那么Java的反射reflection机制是在运行状态中对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意方法和属性既然能拿到那么我们就可以修改部分类型信息这种动态获取信息以及动态调用对象方法的功能称为java语言的反射reflection机制 。
2.反射的相关的类
3.class类代表类的实体在运行的Java应用程序中表示类和接口 。Java文件被编译后生成了.class文件JVM此时就要去解读.class文件 ,被编译后的Java文件.class也被JVM解析为一个对象这个对象就是 java.lang.Class .这样当程序在运行时每个java文件就最终变成了Class类对象的一个实例。我们通过Java的反射机制应用到这个实例就可以去获得甚至去添加改变这个类的属性和动作使得这个类成为一个动态的类 。
4.class类中的相关方法 1.2.反射示例
1.获取class对象的三种方式在反射之前我们需要做的第一步就是先拿到当前需要反射的类的Class对象然后通过Class对象的核心方法达到反射的目的即在运行状态中对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意方法和属性既然能拿到那么我们就可以修改部分类型信息 。
2.第一种使用 Class.forName(类的全路径名); 静态方法。 常用
3.第二种方法使用 .class 方法 4.第三种方法使用类对象的 getClass() 方法 5.以上三种方法是等价的得出的结论是一个类在JVM中只会有一个Class实例对象
1.3.反射的使用
1.通过反射进行创建对象
3.通过反射来调用private修饰的构造方法ConstructorStudent constructor (ConstructorStudent)c1.getDeclaredConstructor(String.class,int.class) 这个语句是先获取指定的私有构造方法Student student constructor.newInstance(caocao,15);是使用刚刚获取的私有构造方法但是在这之前先需要打开这个私有方法的权限constructor.setAccessible(true);通过这个语句来打开私有方法的权限
4.通过反射调用私有的字段ConstructorStudent constructor (ConstructorStudent)c1.getDeclaredConstructor();获取对应的构造方法无论他的访问修饰限定符是什么都会被获取。Student student constructor.newInstance();调用刚刚获取的没有参数的构造方法。Field field c1.getDeclaredField(name);再通过这个语句获取私有的成员变量field.setAccessible(true);在通过这个语句打开访问权限field.set(student,zhangsan);再通过这个语句修改私有成员变量 5.通过反射调用私有的成员方法前面的步骤都是一样的获取指定的构造方法使用构造方法Method method c1.getDeclaredMethod(function,String.class);通过这个语句获取这个私有方法并且通过method.setAccessible(true);打开使用权限method.invoke(student,我尝试修改一下function方法的参数);使用这个私有方法
1.4.优点
反射的优点
1. 对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意一个方法
2. 增加程序的灵活性和扩展性降低耦合性提高自适应能力
3. 反射已经运用在了很多流行框架如Struts、Hibernate、Spring 等等。
1.5.缺点
使用反射会有效率问题。会导致程序效率降低。具体参考这里http://www.imooc.com/article/2936792. 反射技术绕过了源代码的技术因而会带来维护问题。反射代码比相应的直接代码更复杂 。
二.枚举
1.主要用途是将一组常量组织起来 。
2.switch语句的使用
3.枚举的常用方法
4.values()方法
5.ordinal()方法
6.valueOf()方法存在这个枚举常量就会返回这个枚举常量不存在就会出现异常 7.compareTo()方法 8.当我们定义好一个枚举类之后这个枚举类就默认继承
9.枚举的构造方法是私有的。 三.枚举和反射的结合在单例模式处详解
四.lambda表达式
1.函数式接口一个接口有且只有一个抽象方法可以有其他的方法 。如果我们在某个接口上声明了 FunctionalInterface 注解那么编译器就会按照函数式接口的定义来要求该接口这样如果有两个抽象方法程序编译就会报错的。所以从某种意义上来说只要你保证你的接口中只有一个抽象方法你可以不加这个注解。加上就会自动进行检测的。
2.lambda表达式使用没有参数没有返回值红色框是lambda表达式的使用。-{} 就是lambda的使用 是参数{}就是重写test里面的语句如果有多个语句就需要花括号{}main1是不使用lambda表示的时候通过匿名内部类来重写接口中的方法。
3.无返回值一个参数 4.无返回值多个参数 5.有返回值没有参数写return就要花括号 6.有返回值一个参数 7.有返回值多个参数 1.2.语法精简
1. 参数类型可以省略如果需要省略每个参数的类型都要省略。
2. 参数的小括号里面只有一个参数那么小括号可以省略
3. 如果方法体当中只有一句代码那么大括号可以省略
4. 如果方法体中只有一条语句且是return语句那么大括号可以省略且去掉return关键字 。
1.3.变量捕获
在使用lambda表达式的时候可以 捕获一个不会改变的常量如果这个常量改变了就无法捕获
1.4.Lambda在集合当中的使用
在ArrayList中打印每个元素的时候会重写函数接口的时候可以使用到lambda的表达式
1.接口的排序
2.map
1.5.优点
1. 代码简洁开发迅速
2. 方便函数式编程
3. 非常容易进行并行计算
4. Java 引入 Lambda改善了集合操作 。
1.6.缺点
1. 代码可读性变差
2. 在非并行计算中很多计算未必有传统的 for 性能要高
3. 不容易进行调试