目录
一、反射
1.反射是什么
2.反射操作的四个核心类(都处在java.lang.reflect)
3.在java中获取一个类的class对象一共有三种途径:
4.想通过反射来操作类或者对象,第一步就是要获得该类的class对象。
5.Constructor应用
6.Method应用
7.Field应用
二、Lambda表达式(有的语言称为闭包)
1.最常见的写法:
2.使用匿名内部类来简化子类的实现。
3.使用Lambda表达式
4.不同情况的Lambda表达式
一、反射
1.反射是什么
动态(运行时)获取类信息以及动态调用该对象的属性和方法的功能,就叫反射
在所有第三方框架的基础上。在运行时,
对任意一个类,都能拿到该类的所有属性和方法的信息
对于任意一个属性,都能调用该对象的任意属性和方法。
2.反射操作的四个核心类(都处在java.lang.reflect)
class 关键字,声明一个类
Class:反射操作的核心类
Constructor:与构造方法相关的类
Methon:与类中方法相关的类
Field:与类中属性相关的类
3.在java中获取一个类的class对象一共有三种途径:
(1)直接通过类名称 .class获取class对象
(2)通过该类的任意实例化对象,调用getClass()方法
(3)使用Class类提供的Class.forName("类的全名称")
4.想通过反射来操作类或者对象,第一步就是要获得该类的class对象。
编译期类型
运行时类型RTTI
Person per = new Student();
per这个引用编译期类型就是Person
最终在JVM运行的时候,到底是哪个类型,运行时类型
5.Constructor应用
1.通过反射来创建一个类的实例
通过class对象的newInstance()方法默认调用该类的无参构造,当无参构造不存在,或者无参构造不可见(private,不同包的包权限)这个方法无法使用。
2.当需要使用类的其他构造方法来创建对象时,需要用到和构造方法这个结构相关的反射类Constructor
(1) Class类的getConstructors():只能获取当前类的所有public权限的构造方法
无法获取父类的Constructor对象
(2)Class类的getDeclearConstructors()可以拿到当前类的所有构造方法,甚至包含私有方法
无法获取父类的Constructor对象
(3)拿到指定的Constructor对象,可以通过该对象来创建实例化Student对象
(4)通过constructor类创建私有构造方法的对象
6.Method应用
(1)cls.getMethods( ) 可以拿到当前类已经父类的所有public方法
(2)cls.getDeclareMethods() 仅能拿到当前类定义的所有方法,包含private方法
拿到Methods对象后,通过反射来调用对象的
总结:通过反射来调用一个类的方法
1.先获取该类的class对象
2.通过getDec或getMethod获取这个方法的method反射对象
3.若该方法是一个成员方法,还需要产生该类的实例
4.method.invoke(该类的实例(如果是静态方法就是null),具体的方法参数);
7.Field应用
Field的使用
1.先获取class对象
2.获取指定名称的Field对象
3.创建该类的实例(如果你调用的是成员属性)
4. set(obj-具体操作的对象,要设置的属性值)
get(obj-具体操作的对象)--获取相应的属性值。
二、Lambda表达式(有的语言称为闭包)
一种编程范式,函数式编程
面向对象的编程,啥都需要类,有个对象,通过对象去处理数据和方法
在大数据运算中,通常我们只需要关系特定的方法调用即可。
在Java中,Lambda表达式的前身就是匿名内部类的简化写法
Lambda表达式的语法:
(参数列表) -> {
方法体代码
[return 返回值];
}
1.最常见的写法:
2.使用匿名内部类来简化子类的实现。
假设此时具体的实现子类只会使用一次,就没必要每次都创建一个对象
相当于
class 没名字 implements Imessage{
覆写了printMessage方法
}
3.使用Lambda表达式
使用规则:
如果只有一条语句,花括号可以省略。大于一条,不能省略
参数类型可以省略,若省略了,则每个参数的类型都要省略
1.直接省略了所有和类相关的代码,只保留了最核心的方法的代码,包括方法的参数,方法的方法体
任何一个可以使用Lambda表达式的接口,前提是只有一个抽象方法(Lambda表达式把方法名都省了,因此默认就覆写那个抽象方法)
2.此注解用在接口声明上,检查当前的接口是否只包含一个抽象方法
3. 在JDK1.8中,对接口做了扩展,允许接口存在普通方法。
普通方法使用default来声明,包含方法体。
4.不同情况的Lambda表达式
对于接口的抽象方法分为以下几种情况
(1)无返回值无参数
(2)无返回值有参数
(3)有返回值无参数
(4)有返回值有参数
public class LambdaUsage {
public static void main(String[] args) {
// NonReturnNonParameter i1 = () -> {
// //如果有多行代码,大括号不可以省略
// System.out.println("我是第一行");
// System.out.println("我是第二行");
// System.out.println("我是第三行");
// };
// i1.test1(); //调用的就是刚覆写的方法
//
//
//
// NonReturnHasParameter i2 = (t1,t2) -> {
// t1 =t1+1;
// t2 = "门门";
// System.out.println(t2 + ":" +t1);
// };
// i2.test2(18,"hello");
// HasReturnNoneParameter i3 = () -> {
// int num =0;
// //num要经过一大堆的运算
// num += 10;
// return num;
// };
// int res = i3.test3();
// System.out.println(res);
// HasReturnNoneParameter i3 = () ->10;
// int res =i3.test3();
// System.out.println(res);
HasReturnHasParameter i4 = (t1,t2) -> {
t1 += 101;
System.out.println(t2);
return t1;
};
int res = i4.test4(18,"我是门门");
System.out.println(res);
}
}
interface NonReturnNonParameter{
void test1();
}
interface NonReturnHasParameter{
void test2(int age,String name);
}
interface HasReturnNoneParameter{
int test3();
}
interface HasReturnHasParameter{
int test4(int age,String name);
}