GVKun编程网logo

java.util.ServiceLoader 使用(java.util.locale)

6

如果您对java.util.ServiceLoader使用感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于java.util.ServiceLoader使用的详细内容,我们还

如果您对java.util.ServiceLoader 使用感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于java.util.ServiceLoader 使用的详细内容,我们还将为您解答java.util.locale的相关问题,并且为您提供关于'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”、android – 解压缩zip文件给出“java.util.zip.ZipException:无法读取版本”或“java.util.ZipException无法读取本地标题版本45”、com.intellij.util.ReflectionUtil 对方法 java.util.ResourceBundle.setParent(java.util.ResourceBundle) 的非法反射访问、CompletableFuture 源码详解之 java.util.concurrent.CompletableFuture#supplyAsync (java.util.function.Suppl...的有价值信息。

本文目录一览:

java.util.ServiceLoader 使用(java.util.locale)

java.util.ServiceLoader 使用(java.util.locale)

近期在项目中需要实现能在配置文件中定义多个统一接口类型的类,可以在程序中获取到所有配置的类,刚开始打算配置到 properties 中,然后去程序读取,感觉这种方式不太灵活,于是,研究研究 java 中有没有这种支持,最终确认 ServiceLoader 可以实现这种功能,下面讲解如何使用 ServiceLoader 类。

首先定义一个接口程序的定义如下:

public interface IShareniuService {
public String sayHello();
 
public String getScheme();
}
public class ShareniuserverImp1 implements IShareniuService {
 
public String sayHello() {
return "shareniu1sayHello";
}
 
public String getScheme() {
return "shareniu1getScheme";
}
 
}
public String sayHello() {
return "shareniu2sayHello";
}
 
public String getScheme() {
return "shareniu2getScheme";
}


需要在 META-INF/services 下以 IShareniuService 这个类的全名来新建立一个文件,文件中的内容为两个实现类的全名,如下:

 

所有的实现和配置都已经完成,下面写一个测试类来看一下结果:

ServiceLoader<IShareniuService> serviceLoader = ServiceLoader  
                .load(IShareniuService.class);  
        for (IShareniuService service : serviceLoader) {  
            System.out.println(service.getScheme()+"="+service.sayHello());  
        }


具体的输出来如下:

shareniu2getScheme=shareniu2sayHello

shareniu1getScheme=shareniu1sayHello

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

hadoop FileSystem 就是通过这个机制来根据不同文件的 scheme 来返回不同的 FileSystem

FileSystem 中的相关实例如下:

private static void loadFileSystems() {  
  synchronized (FileSystem.class) {  
    if (!FILE_SYSTEMS_LOADED) {  
      ServiceLoader<FileSystem> serviceLoader = ServiceLoader.load(FileSystem.class);  
      for (FileSystem fs : serviceLoader) {  
        SERVICE_FILE_SYSTEMS.put(fs.getScheme(), fs.getClass());  
      }  
      FILE_SYSTEMS_LOADED = true;  
    }  
  }  

FileSystem 对应的配置如下:

org.apache.hadoop.fs.LocalFileSystem  
org.apache.hadoop.fs.viewfs.ViewFileSystem  
org.apache.hadoop.fs.s3.S3FileSystem  
org.apache.hadoop.fs.s3native.NativeS3FileSystem  
org.apache.hadoop.fs.kfs.KosmosFileSystem  
org.apache.hadoop.fs.ftp.FTPFileSystem  
org.apache.hadoop.fs.HarFileSystem 

通过之前的测试类输出对应的 scheme class 如下:

file=class org.apache.hadoop.fs.LocalFileSystem  
viewfs=class org.apache.hadoop.fs.viewfs.ViewFileSystem  
s3=class org.apache.hadoop.fs.s3.S3FileSystem  
s3n=class org.apache.hadoop.fs.s3native.NativeS3FileSystem  
kfs=class org.apache.hadoop.fs.kfs.KosmosFileSystem  
ftp=class org.apache.hadoop.fs.ftp.FTPFileSystem  
har=class org.apache.hadoop.fs.HarFileSystem  
hdfs=class org.apache.hadoop.hdfs.DistributedFileSystem  
hftp=class org.apache.hadoop.hdfs.HftpFileSystem  
hsftp=class org.apache.hadoop.hdfs.HsftpFileSystem  
webhdfs=class org.apache.hadoop.hdfs.web.WebHdfsFileSystem 

可以看到 FileSystem 会把所有的 FileSystem 的实现都以 scheme class cache,之后就从这个 cache 中取相应的值。

因此,以后可以通过 ServiceLoader 来实现一些类似的功能。而不用依赖像 Spring 这样的第三方框架。


'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”

'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”

如何解决''java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”?

我收到此错误,我已阅读该错误以解决它我必须将 import java.util.Base64 替换为 import android.util.Base64 但在我的整个项目中我只发现 Base68 result = Base64.getEncoder().encodetoString(macData); 的唯一用法 我该如何解决?而且我不能用 android.util.Base.64 替换 java.util.Base64 因为这行代码在后端

解决方法

这很不幸 - 这意味着您正在使用某个库,而那个库正在尝试使用 /i。 Android 选择了 Java 库,就像 android 发布时一样,现在已经是很久以前的事了。从那以后它们就没有真正更新过。 (那个 oracle v google 法庭案件可能没有帮助……)

java.util.Base64 已添加到 https://forge.autodesk.com/en/docs/design-automation/v3/reference/cmdLine/cmdLine-inventor/(有关此信息,请参阅 javadoc 中的“since”行;任何“1.6”或以下,或者如果没有“since”行,肯定可用在 android 上。其他东西通常不是)。 java 8 现在已经 7 岁了,因此不是专门为 android 设计的库越来越有可能开始使用这些非 android 库调用。

检查堆栈跟踪,您会找到正在执行此操作的库。恐怕除了停止使用这个库之外别无他法。您可以尝试在您的应用程序中粘贴 juBase64 impl,但这会相对棘手,因为这可能涉及一些法律问题,因此,要么没有人这样做,要么如果他们这样做,他们可能不会宣传如何。

您可以要求这个库使用第三方库来做 base64 工作,但他们可能不想这样做,这可能不是库无法在 android 上运行的唯一问题。

如果 android 变体是一个替代品,你可以重写这个库的类文件,但这也是一个有点笨拙、笨拙的概念,并不完全困难,但因为这不是一件正常的事情,而且通常积极不喜欢,我认为您无法轻松找到有关如何操作的文档。

因此,建议:尝试寻找另一个图书馆。

android – 解压缩zip文件给出“java.util.zip.ZipException:无法读取版本”或“java.util.ZipException无法读取本地标题版本45”

android – 解压缩zip文件给出“java.util.zip.ZipException:无法读取版本”或“java.util.ZipException无法读取本地标题版本45”

我想提取一个普通的zip文件,但它仍然失败.
这是我现在使用的代码:

private File downloadpath = new File(Environment.getExternalStorageDirectory() + "/Test/file.zip");
private File unzipLoc = new File(Environment.getExternalStorageDirectory() + "/Test/");
        FileInputStream fin = new FileInputStream(downloadpath); 
        ZipInputStream zin = new ZipInputStream(fin);
        ZipEntry ze = null; 
        while ((ze = zin.getNextEntry()) != null) 
        { 
            FileOutputStream fout = new FileOutputStream(unzipLoc + ze.getName()); 
            for (int c = zin.read(); c != -1; c = zin.read()) 
            { 
                fout.write(c); 
            } 

            zin.closeEntry(); 
            fout.close(); 
        } 
        zin.close(); 

它在’zin.getNextEntry()’部分失败.
错误:java.util.zip.ZipException:无法读取版本
有任何想法吗?谢谢!

解决方法:

看起来你的zip文件比你的’解压缩库’更新.

如果您阅读来源:

ZipInputStream(搜索新的ZipException(“无法读取版本”))

它显示它检查zip文件版本.然后查看Wikipedia它显示这是提取zip所需的最低版本.

检查您的zip文件并使用较低版本的zip软件重新保存/再次压缩,无需压缩即可测试

或者更新你的Zip库(你不能使用内部的android zip库).

com.intellij.util.ReflectionUtil 对方法 java.util.ResourceBundle.setParent(java.util.ResourceBundle) 的非法反射访问

com.intellij.util.ReflectionUtil 对方法 java.util.ResourceBundle.setParent(java.util.ResourceBundle) 的非法反射访问

如何解决com.intellij.util.ReflectionUtil 对方法 java.util.ResourceBundle.setParent(java.util.ResourceBundle) 的非法反射访问

我在 VSCode 中编写了一些 kotlin 代码

其中之一是:

public void readCSV(String fileName) {
    fileLocation = fileName;
    File csvFile = new File(fileName);
    Scanner sfile;
//    noOfColumns = 0;
//    noOfRows = 0;
    data = new ArrayList<ArrayList>();
    int colCounter = 0;
    int rowCounter = 0;
    
    try {
        sfile = new Scanner(csvFile);
        
        while (sfile.hasNextLine()) {
            String aLine = sfile.nextLine();
            Scanner sline = new Scanner(aLine);
            sline.useDelimiter(",");
            colCounter = 0;
            while (sline.hasNext()) {
                if (rowCounter == 0) 
                    data.add(new ArrayList<String>());
                
                
                data.get(colCounter).add(sline.next());
                colCounter++;
            }
            rowCounter++;
            sline.close();
        }
//        noOfColumns = colCounter;
//        noOfRows = rowCounter;
        sfile.close();
    } catch (FileNotFoundException e) {
        System.out.println("File to read " + csvFile + " not found!");
    }
} 

当我运行它时,我得到:

fun main() {
println("Hello world")
}

它有效,但我无法隐藏或修复警告,我使用 JDK 15

我在 IntelliJ 上没有收到这些警告

CompletableFuture 源码详解之 java.util.concurrent.CompletableFuture#supplyAsync (java.util.function.Suppl...

CompletableFuture 源码详解之 java.util.concurrent.CompletableFuture#supplyAsync (java.util.function.Suppl...

/**
     * Returns a new CompletableFuture that is asynchronously completed
     * by a task running in the {@link ForkJoinPool#commonPool()} with
     * the value obtained by calling the given Supplier.
     *
     * @param supplier a function returning the value to be used
     * to complete the returned CompletableFuture
     * @param <U> the function''s return type
     * @return the new CompletableFuture
     */
    public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
        return asyncSupplyStage(asyncPool, supplier);
    }

  CompletableFuture 下的 supplyAsync 方法是一个执行异步任务且有返回结果的任务,使用例子如下:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * 测试类
 * @author yangchangkui
 */
public class TestMy {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long start = System.currentTimeMillis();
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "hello";
        });
        //判断是否已经完成
        System.out.println("耗时:"+(System.currentTimeMillis()-start)+",isDone:"+completableFuture.isDone());
        //阻塞获取结果
        String result = completableFuture.get();
        System.out.println("耗时:"+(System.currentTimeMillis()-start)+",result:"+result);
        //判断是否已经完成
        System.out.println("耗时:"+(System.currentTimeMillis()-start)+",isDone:"+completableFuture.isDone());

    }
}

  执行结果如下,显然,达到了异步执行的效果,比如在一些调用很多外部接口的聚合接口,只要接口不作为入参,那就可以进行异步执行,最后阻塞拿结果,提高接口的 QPS,提高系统性能。

 

今天关于java.util.ServiceLoader 使用java.util.locale的分享就到这里,希望大家有所收获,若想了解更多关于'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”、android – 解压缩zip文件给出“java.util.zip.ZipException:无法读取版本”或“java.util.ZipException无法读取本地标题版本45”、com.intellij.util.ReflectionUtil 对方法 java.util.ResourceBundle.setParent(java.util.ResourceBundle) 的非法反射访问、CompletableFuture 源码详解之 java.util.concurrent.CompletableFuture#supplyAsync (java.util.function.Suppl...等相关知识,可以在本站进行查询。

本文标签: