作者最近研究框架底层代码过程中感觉自己基础不太牢固,于是写了一点案例,以防日后忘记

接口类: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表达式的更多相关文章

  1. Java函数式接口与Lambda表达式

    什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...

  2. Java函数式编程:一、函数式接口,lambda表达式和方法引用

    Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...

  3. Java 关于函数式接口与Lambda表达式之间的关系

    java是一种面向对象的语言,java中的一切都是对象,即数组,每个类创建的实例也是对象.在java中定义的函数或方法不可能完全独立,也不能将方法函数作为参数或返回值给实例. 在java7及以前,我们 ...

  4. Java开发笔记(六十二)如何定义函数式接口

    前面介绍了Lambda表达式的用法,从实践中发现它确实极大地方便了开发者,然而不管是匿名内部类还是Lambda表达式,所举的例子都离不开各类数组的排序方法,倘使Lambda表达式仅能用于sort方法, ...

  5. Java 函数式编程和Lambda表达式

    1.Java 8最重要的新特性 Lambda表达式.接口改进(默认方法)和批数据处理. 2.函数式编程 本质上来说,编程关注两个维度:数据和数据上的操作. 面向对象的编程泛型强调让操作围绕数据,这样可 ...

  6. Java 反射 Method的invoke回调调用任意方法

    Java 反射 Method的invoke回调调用任意方法 @author ixenos 关键子:Method.Field.invoke方法指针/函数指针.回调函数 invoke回调流程示例 0.由C ...

  7. Java 反射 调用私有域和方法(setAccessible)

    Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...

  8. 【译】7. Java反射——私有字段和私有方法

    原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...

  9. Java反射理解(五)-- 方法反射的基本操作

    Java反射理解(五)-- 方法反射的基本操作 方法的反射 1. 如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法 2. 方法反射的操作 method.invoke(对象,参数列表) ...

随机推荐

  1. NodeService Ensure that Node.js is installed and can be found in one of the PATH directories

    今天发布NodeService到服务器,服务器环境是window server 2012 一直报错: [1] Ensure that Node.js is installed and can be f ...

  2. 文件重命名工具(ReNamer)7.2中文绿色便携专业版

    ReNamer 是一个非常强大和灵活的文件重命名工具,它提供所有标准的重命名过程,包括前缀.后缀.替换.大小写更改以及删除括号内容.添加编号规则.更改文件扩展名等.对于高级用户,支持正则表达式和 Pa ...

  3. 安装nginx并安全地配置和启动

    一.安装nginx >>参考文章<< 安装教程,看代码&注释 # .sh # 如果centos服务器是最低安装,则先安装weget yum install -y wge ...

  4. 移动端和PC端区分

    1.移动端包括:浏览器.ios/android.qq端.微信端 九度数据官网源码.修改,要跳转的链接即可. function browserRedirect() { var sUserAgent = ...

  5. 解决python3 ,ModuleNotFoundError: No module named 'pip'问题

    今天想要装一下PyYmal第三方库来写一下Python的desired_caps.yaml文件,候发现cmd窗口下无法执行pip命令, 出现了:ModuleNotFoundError: No modu ...

  6. v-once

    v-once 使用了这个指令,那么这个值将只会渲染一次,后续将不会再被更改 初始运行结果: 在控制台中分别修改他们的值: 可以看到使用了v-once指令的插值没有被修改.

  7. IIS应用程序池配置详解及优化

    参数说明 1.常规 属性名称 属性详解 NET CLR 版本 配置应用程序池,以加载特定版本的 .NET CLR.选定的 CLR版本应与应用程序所使用的相应版本的 .NET Framework 对应. ...

  8. mini-web框架-装饰器-总结1(5.3.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 原则:开放封闭 可以扩展,但是不可以修改.也就是说软件对扩展开放,对修改关闭. 运用技术:闭包 一共两种方法,一个使用闭包,一个使用类 使用多个装饰器 ...

  9. js--数组的filter()过滤方法的使用

    前言 你还在通过for循环遍历数组吗?你还在遍历之后一项一项的通过if判断过滤你需要的数据吗?你还在写着一大堆代码实现一个简单的过滤数据功能吗?那么,今天他来了.他就是这里要介绍的es6中数组filt ...

  10. PHP可变变量特性

    可变变量 有时候使用可变变量名是很方便的.就是说,一个变量的变量名可以动态的设置和使用.一个普通的变量通过声明来设置,例如: <?php$a = 'hello';?> 一个可变变量获取了一 ...