`
fantaxy025025
  • 浏览: 1302825 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

java_ServiceLoader和ClassLoader

 
阅读更多

 

ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一个类声明周期的第一步(一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况)。详情请参阅:详解Java类的生命周期

ServiceLoader又是什么呢?ServiceLoader:一个简单的服务提供者加载设施。服务 是一个熟知的接口和类(通常为抽象类)集合。服务提供者 是服务的特定实现。提供者中的类通常实现接口,并子类化在服务本身中定义的子类。服务提供者可以以扩展的形式安装在 Java 平台的实现中,也就是将 jar 文件放入任意常用的扩展目录中。也可通过将提供者加入应用程序类路径,或者通过其他某些特定于平台的方式使其可用。……唯一强制要求的是,提供者类必须具有不带参数的构造方法,以便它们可以在加载中被实例化。(注意:加载时就实例化了。)

通过在资源目录META-INF/services中放置提供者配置文件 来标识服务提供者。文件名称是服务类型的完全限定二进制名称。该文件包含一个具体提供者类的完全限定二进制名称列表,每行一个。忽略各名称周围的空格、制表符和空行。注释字符为'#'('\u0023', NUMBER SIGN);忽略每行第一个注释字符后面的所有字符。文件必须使用 UTF-8 编码。 

以延迟方式查找和实例化提供者,也就是说根据需要进行。服务加载器维护到目前为止已经加载的提供者缓存。每次调用iterator 方法返回一个迭代器,它首先按照实例化顺序生成缓存的所有元素,然后以延迟方式查找和实例化所有剩余的提供者,依次将每个提供者添加到缓存。可以通过 reload 方法清除缓存。

……

以上来源于Java API里的说明,也许说的很专业,让我们有点晕头转向,我们可以简单的认为:ServiceLoader也像ClassLoader一样,能装载类文件,但是使用时有区别,具体区别如下:

(1) ServiceLoader装载的是一系列有某种共同特征的实现类,而ClassLoader是个万能加载器;

         (本人注:注意:加载时就实例化了。)

(2)ServiceLoader装载时需要特殊的配置,使用时也与ClassLoader有所区别;

(3)ServiceLoader还实现了Iterator接口。[如有错误或不到的地方敬请指出,互相学习:)]

下面是关于ServiceLoader的简单的例子,仅供参考

(1)基础服务:IService

1
2
3
4
5
package com.service;
public interface IService {
    String sayHello();
    String getScheme();
}

 

(2)具体服务实现1:HDFSService

1
2
3
4
5
6
7
8
9
10
11
12
package com.impl;
import com.service.IService;
public class HDFSService implements IService {
    @Override
    public String sayHello() {
        return "Hello HDFSService";
    }
    @Override
    public String getScheme() {
        return "hdfs";
    }
}

 

(3)具体服务实现2:LocalService

 

1
2
3
4
5
6
7
8
9
10
11
12
package com.impl;
import com.service.IService;
public class LocalService  implements IService {
    @Override
    public String sayHello() {
        return "Hello LocalService";
    }
    @Override
    public String getScheme() {
        return "local";
    }
}

(4)配置:META-INF/services/com.service.IService

 

 

1
2
com.impl.HDFSService
com.impl.LocalService

(5)测试类

1
2
3
4
5
6
7
8
9
10
11
package com.test;
import java.util.ServiceLoader;
import com.service.IService;
public class Test {
    public static void main(String[] args) {
        ServiceLoader<IService> serviceLoader  = ServiceLoader.load(IService.class);
        for (IService service : serviceLoader) {
            System.out.println(service.getScheme()+"="+service.sayHello());
        }
    }
}

 

结果:

hdfs=Hello HDFSService
local=Hello LocalService

可以看到ServiceLoader可以根据IService把定义的两个实现类找出来,返回一个ServiceLoader的实现,而ServiceLoader实现了Iterable接口,所以可以通过ServiceLoader来遍历所有在配置文件中定义的类的实例。

 

prefer: http://my.oschina.net/hanzhankang/blog/109794

 

+

+

+

0

+

+

+

 

分享到:
评论

相关推荐

    Java_ClassLoader详解

    ### Java ClassLoader 详解 #### 一、ClassLoader 概述 在 Java 语言中,类加载器(ClassLoader)是 Java 运行时环境的核心组成部分之一,它负责将编译后的 `.class` 文件加载到 JVM 中执行。从 JDK 1.0 开始,...

    深入Java虚拟机_ClassLoader

    《深入Java虚拟机_ClassLoader》是一本专注于Java虚拟机(JVM)中ClassLoader部分的专著,旨在帮助读者深入理解Java程序如何加载、链接和初始化类。ClassLoader是Java平台核心特性的一部分,它负责查找和加载类到JVM...

    web_classloader_test.zip_web classloader

    在Java Web应用中,类加载...通过分析`web_classloader_test`,我们可以学习到如何理解和调试Web应用的类加载问题,以及如何利用类加载器的特性来实现特定的功能。这个示例对于理解Java Web应用的运行机制非常有价值。

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

    resolver_java_wsdl.jar

    at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:688) at java.lang.ClassLoader.loadClass(ClassLoader.java:667) at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:119) at...

    java classloader

    深入Java 2 SDK.pdf`可能涉及的是Java与其他工具和技术的集成,如与微软Office的交互、使用Visual Studio .NET管理Java应用、Ant构建工具的使用以及对Java 2 SDK的深入理解,这些都可能间接地涉及到ClassLoader的...

    java自定义类加载classloader文档,包括代码

    上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...

    Note_scalad.tar.gz

    Scala_Java_Override_Variable_Parameter Scala_Map_List_Array Security_Camera_Invade SpringBoot-RabbitMQ SpringBoot-Scala SpringBoot-Swagger SpringBoot SpringBoot_ApplicationContext SpringBoot_DevTools ...

    Java ClassLoader定制实例

    理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将深入探讨Java ClassLoader的内部工作,并通过一个具体的实例来展示如何定制自己的ClassLoader。 ...

    JVM.zip_JVM代理_classloader

    而JVM代理(JVM Agent)和类加载器(ClassLoader)则是两个关键的概念,它们对于深入理解Java应用程序的运行机制至关重要。 **JVM代理** JVM代理是一种在JVM启动时或者运行时插入额外功能的方式,它允许开发者在不...

    Java_LSPosed框架.zip

    Java_LSPosed框架是一款针对Android系统的开源框架,它允许用户在不 root 设备的情况下,对系统级别的应用进行修改和扩展。LSPosed基于著名的Xposed框架,由Java语言编写,因此得名Java_LSPosed。这个框架使得开发者...

    java classloader classpath 张孝祥

    ### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath...

    理解Java ClassLoader机制

    在Java中,ClassLoader分为三个主要层次:Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader(也称为System ClassLoader)。Bootstrap ClassLoader是JVM启动时的第一个加载器,负责加载JDK的根目录下`...

    java中ClassLoader

    Java 中的 ClassLoader 提供了一系列的方法来完成加载类的这个职责,例如加载 Java 应用所需的资源,如图像文件和配置文件等。ClassLoader 还负责加载 Java 应用程序所需的类文件,以便在程序运行时可以正确地调用...

    JAVA_SE毕向东 笔记

    1. **Java的特性和优势**: - 简单性:Java的设计使得编程变得简单直观。 - 面向对象:Java支持封装、继承、多态等面向对象编程的核心特性。 - 可移植性(Write Once, Run Anywhere):编写的Java程序可以在任何...

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    总的来说,ClassLoader是Java平台的核心组件之一,它的设计和实现对于理解JVM的工作原理至关重要。深入学习ClassLoader不仅可以提高编程能力,也有助于解决实际开发中遇到的复杂问题。通过阅读源码,我们可以更深入...

    java_lang包详解.pdf

    java.lang包还包含了一些与安全、线程和内存管理相关的类,如SecurityManager用于安全管理,Thread和ThreadGroup是线程相关的类,ClassLoader负责加载类,ThreadLocal为每个线程提供独立的变量副本,而Runtime类提供...

Global site tag (gtag.js) - Google Analytics