博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊、Java SPI
阅读量:4439 次
发布时间:2019-06-07

本文共 1343 字,大约阅读时间需要 4 分钟。

SPI,Service Provider Interface,服务提供者接口。

Animal 接口


 package com.rockcode.www.spi;

 public interface Animal {

 void speek();

}

Dog 类


 package com.rockcode.www.spi;

 public class Dog implements Animal {

 public void speek() {

System.out.println("....Dog....");

}

 }

SPI规范


 

com.rockcode.www.spi.Animal 文件内容 com.rockcode.www.spi.Dog

注意,文件必须位于 Jar 包的 META-INF/services 下面,名称与接口名相同

ServiceLoader


 

ServiceLoader<Animal> loader = ServiceLoader.load(Animal.class);

for (Animal an : loader) {
an.speek();
}

 

源码


 

URL url = ClassLoader.getSystemClassLoader().getResource(

"META-INF/services/" + Animal.class.getName());
InputStream ins = null;
BufferedReader br = null;
try {
ins = url.openStream();
br = new BufferedReader(new InputStreamReader(ins));

 

String ln = br.readLine();

System.out.println(ln);

 

try {

Class<?> c = Class.forName(ln);
try {
Object o = c.newInstance();
Dog d = (Dog) c.cast(o);
d.speek();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

 

} catch (IOException e) {

e.printStackTrace();
} finally {
if (br != null)
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (ins != null)
try {
ins.close();
} catch (IOException e) {
e.printStackTrace();
}
}

 

 

 

 

 

转载于:https://www.cnblogs.com/xums/p/10398467.html

你可能感兴趣的文章
python函数
查看>>
C++实现网格水印之调试笔记(二)
查看>>
[技术讨论]关于前几天公布的京东bug上的问题分析
查看>>
设计模式学习笔记(总结篇:模式分类)
查看>>
算法笔记_075:蓝桥杯练习 最短路(Java)
查看>>
TCP的三次握手/建立连接
查看>>
Python 教程阅读笔记(一):使用解释器
查看>>
运算符重载
查看>>
SDWebImage 新版接口使用方法
查看>>
iPhone 和 Galaxy高速拍照原理具体分析
查看>>
简单的jQuery检测注册用户名
查看>>
DataTable导出为word,excel,html,csv,pdf,.txt
查看>>
JS中期知识点总结11月15日
查看>>
zookeeper介绍
查看>>
HDU 4336 Card Collector
查看>>
android ListView详解
查看>>
使用excel估计GARCH模型参数——以GARCH(1,1)为例
查看>>
软件工程 第一次作业
查看>>
Content Server HA搭建
查看>>
vue-textarea 自适应高度
查看>>