java反射-Method中的invoke方法的用法-以及函数式接口和lambda表达式
作者最近研究框架底层代码过程中感觉自己基础不太牢固,于是写了一点案例,以防日后忘记
接口类:Animals
1 public interface Animals {
2
3 public void eat();
4 }
package cn.chenc.study.entity;
public interface InterfaceFactory {
public String show(int i);
}
实体类:Person
package cn.chenc.study.entity;
import java.lang.reflect.Proxy;
public class Person implements Animals {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void show(String name,int age){
System.out.println("name="+name+",age="+age);
}
public void eat(){
System.out.println("人用餐具吃饭");
}
public void run(String s,int i){
System.out.println("人用"+i+"只"+s+"走路");
}
}
测试类:
package cn.chenc.study; import cn.chenc.study.entity.Animals;
import cn.chenc.study.entity.InterfaceFactory;
import cn.chenc.study.entity.Person; import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class Demo1 { public static void main(String[] args) throws Exception{
//调用toString
Class clazz=Class.forName("cn.chenc.study.entity.Person");
Method method=clazz.getMethod("toString");
Constructor constructor=clazz.getConstructor(String.class,int.class);
Object object=constructor.newInstance("secret",21);
System.out.println(method.invoke(object,null));
//调用show
method=clazz.getMethod("show",String.class,int.class); method.invoke(object,"chen",19); //接口测试,person实现animals
Class[] interfaces= clazz.getInterfaces();
Class childClass=interfaces.getClass();
Class inter=interfaces[0]; method=inter.getMethod("eat");
method.invoke(object); //代理测试
Animals proxy = (Animals) Proxy.newProxyInstance(clazz.getClassLoader(), interfaces, (proxy1, method1, args_temp) -> {
Object result = method1.invoke(object, args_temp);
return result;
});
proxy.run("脚", 2); //lanmbda 函数式接口
lambdaTest((a) -> {
// return new Person();
return String.valueOf(a);
}); } public static void lambdaTest(InterfaceFactory interfaceFactory){
System.out.println(interfaceFactory.show(1)); }
}
总结:
函数式接口:。
InterfaceFactory interfaceFactory=
(a) -> {
// return new Person();
return String.valueOf(a);
};
实际上这里是创建了一个匿名的子类对象,并且实现了show方法,show方法的是参数int类型,返回值String类型。函数式接口有且只有一个抽象方法,可以有很多个非抽象方法,比如静态方法。在接口中,
变量默认是puublic static final
方法默认是public abstract
前三种都是通过指定className和method方法来实现的调用,如果进行传参还需要getMethod,感觉还是挺不灵活的。
如果使用动态代理的话,就可以直接使用接口来调用,并且还能实现方法的增强。
Proxy类就是用来创建一个代理对象的类,我们最常用的是newProxyInstance方法。
InvocationHandler也是动态代理一个很重要的接口,里面有一个invoke方法,我这里是使用了lambda表达式来实现了这个接口。
java反射-Method中的invoke方法的用法-以及函数式接口和lambda表达式的更多相关文章
- Java函数式接口与Lambda表达式
什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...
- Java 关于函数式接口与Lambda表达式之间的关系
java是一种面向对象的语言,java中的一切都是对象,即数组,每个类创建的实例也是对象.在java中定义的函数或方法不可能完全独立,也不能将方法函数作为参数或返回值给实例. 在java7及以前,我们 ...
- Java开发笔记(六十二)如何定义函数式接口
前面介绍了Lambda表达式的用法,从实践中发现它确实极大地方便了开发者,然而不管是匿名内部类还是Lambda表达式,所举的例子都离不开各类数组的排序方法,倘使Lambda表达式仅能用于sort方法, ...
- Java 函数式编程和Lambda表达式
1.Java 8最重要的新特性 Lambda表达式.接口改进(默认方法)和批数据处理. 2.函数式编程 本质上来说,编程关注两个维度:数据和数据上的操作. 面向对象的编程泛型强调让操作围绕数据,这样可 ...
- Java 反射 Method的invoke回调调用任意方法
Java 反射 Method的invoke回调调用任意方法 @author ixenos 关键子:Method.Field.invoke方法指针/函数指针.回调函数 invoke回调流程示例 0.由C ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
- 【译】7. Java反射——私有字段和私有方法
原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...
- Java反射理解(五)-- 方法反射的基本操作
Java反射理解(五)-- 方法反射的基本操作 方法的反射 1. 如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法 2. 方法反射的操作 method.invoke(对象,参数列表) ...
随机推荐
- mysql游标cursor与for循环
delimiter // create procedure p2() begin declare row_id int DEFAULT 0; declare row_num int DEFAULT 0 ...
- 交叉熵损失函数,以及pytorch CrossEntropyLoss的理解
实际运用例子: https://zhuanlan.zhihu.com/p/35709485 pytorch CrossEntropyLoss,参考博客如下: https://mathpretty.co ...
- 算法(图论)——最小生成树及其题目应用(prim和Kruskal算法实现)
题目 n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销? Kruskal算法 特点 适用于稀疏图,时间复杂度 是nlogn的. 核心思想 从小到大选取不会产生环的边. 代码实现 代码中 ...
- Linux相关知识基础
目录 前言 第一章 Linux远程连接管理 1. 为什么要远程连接Linux系统 2. 连接前的小知识 2.2.1 IP地址 2.2.2 端口的概念 2.2.3 协议的概念 3. 远程连接Linux的 ...
- Hive数据倾斜优化
在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...
- 面试 HTTP和HTML 浏览器
HTTP和HTML 浏览器 #说一下http和https #参考回答: https的SSL加密是在传输层实现的. (1)http和https的基本概念 http: 超文本传输协议,是互联网上应用最为广 ...
- 用DirectX12绘制一个Cube
之前一篇文章讲了DirectX12的初始化流程,现在来看看在此基础上如何绘制一个Cube. 首先,我们要为这个Cube准备一个shader,来告诉GPU绘制的具体流程,DirectX中的shader使 ...
- kali 2020安装docker
环境准备 kali虚拟机2020.01x64位版本 安装docker官方文档:https://docs.docker.com/engine/installation/linux/docker-ce/d ...
- Flink 反压 浅入浅出
前言 微信搜[Java3y]关注这个朴实无华的男人,点赞关注是对我最大的支持! 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创 ...
- pixi.js 简单交互事件(点击、缩放、平移)
注意:本文代码使用的Pixi.js版本为PixiJS 5.3.3 pixi中常用的鼠标交互事件: //兼容鼠标和触摸屏的共同触发 type InteractionPointerEvents = &qu ...