java找到指定接口的实现类

获取接口所有实现类的三种方式:Spring的ListableBeanFactory容器的getBeanNamesForType方法、利用Reflections工具进行反射扫描、使用SPI 前言 在策略模式应用中,需要获取到策略接口的所有实现类,本文记录三种获取某接口所有实现类的方法,分别是利用Spring的ListableBeanFactory容器的getBeanNamesForType方法,利用Reflections工具进行反射扫描、利用SPI方式。 1、借助于Spring容器 2、反射扫描 3、SPI ... 阅读详情

一、背景

想在自己开发的项目上加一个算法工具类用来整合不同的算法,并且要求低耦合符合开闭原则,于是想到了《大话设计模式》里的策略模式,但是书中的策略模式还没有达到完全符合开闭原则,同时我在文章结尾看见说可以运用反射机制来大幅降低代码的耦合度,因此开始在学习如何实现,在学习过程中发现需要写一个方法用来找到指定接口的实现类,因此开启了这趟学习之旅。策略模式改进文章:通过反射机制实现一个完美的策略模式

二、寻求答案的路途

刚开始看到根据指定接口找到其实现类,我一下子就想到的Spring,Spring中有一个现成的方法getBeansOfType、getBeanNamesForType刚好符合我们的要求,这个方法就是获取指定bean的所有具体实现类,可以直接拿过来用,用法如下:

//applicationContext通过ApplicationAware自动注入
//key位 beanName,value为bean
Map<String, Interface> result = applicationContext.getBeansOfType(Interface.class);

//返回 beanName 的String 数组
String[] result = applicationContext.getBeanNamesForType(Interface.class);

但是我更想要自己实现一个自己用,因为Spring的方法会遍历搜索所有的实例来判断找出其实现类,而我个人是打算把算法的接口和具体实现都方在同一个包里,没打算放其他地方,所以完全没有必要循环遍历所有的实例

既然要自己实现就先看看别人怎么写的,最好能直接找到别人实现好的轮子

java最全的获取某个接口或者某个类所有对应的所有实现类和继承类的工具类--反射动态获取、非动态获取、按照路径获取等总结

这篇博客的大致思路是:

(1)获取当前线程的ClassLoader对象

(2)根据ClassLoader获取目录对象,并对目录里的文件进行遍历

(3)过滤出.class为结尾的文件,并加载到Vector中

(4)然后对Vector中的类进行判断是不是指定接口的实现类

(5)返回所有符合的类

这篇文章给出了两种实现方式,但是还是有不足支持,这篇文章只能在自己本地测试运行使用,无法应用线上,项目发到线上代码打包成jar包后,这种方式就无法使用了

第二篇文章:获取全部子类或接口的全部实现

这一篇博客给出了两种方式,并同时给出了jar包的处理方法,用到了JarFile工具类,并且实现了全路径的搜索。

第三篇文章:获取Java接口的所有实现类

这篇文章直接实现了我想要的东西并作了总结,里面的流程图做得非常棒。同时解决了如何通过classLoader获取JarFile对象:

此外classLoader.getResource 获得的 资源目录 是个URL对象,如何转换成JarFile对象:

JarURLConnection jarURLConnection = (JarURLConnection)url.openConnection();
   JarFile jarFile = jarURLConnection.getJarFile();

从阅读上面的几篇文章可一得到一个完整的解决思路:

 

三、实现代码

package utils;

import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class ClassUtils {
	
	/*
	 * 获取指定接口的所有实现实例
	 */
	public static List<Object> getAllObjectByInterface(Class<?> c)
			throws InstantiationException, IllegalAccessException {
		List<Object> list = new ArrayList<Object>();
		List<Class<?>> classes = getAllClassByInterface(c);
		for (int i = 0; i < classes.size(); i++) {
			list.add(classes.get(i).newInstance());
		}
		return list;
	}
	
	/*
	 * 获取指定接口的实例的Class对象
	 */
	public static List<Class<?>> getAllClassByInterface(Class<?> c) {
		// 如果传入的参数不是接口直接结束
		if (!c.isInterface()) {
			return null;
		}

		// 获取当前包名
		String packageName = c.getPackage().getName();
		List<Class<?>> allClass = null;
		try {
			allClass = getAllClassFromPackage(packageName);
		} catch (ClassNotFoundException | IOException e) {
			e.printStackTrace();
		}

		ArrayList<Class<?>> list = new ArrayList<Class<?>>();
		for (int i = 0; i < allClass.size(); i++) {
			if (c.isAssignableFrom(allClass.get(i))) {
				if (!c.equals(allClass.get(i))) {
					list.add(allClass.get(i));
				}
			}
		}

		return list;
	}
	
	private static List<Class<?>> getAllClassFromPackage(String packageName) throws IOException, ClassNotFoundException{
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		String path = packageName.replace(".", "/");
		Enumeration<URL> enumeration = classLoader.getResources(path);
		List<String> classNames = getClassNames(enumeration, packageName);
		
		ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
		for (int i = 0; i < classNames.size(); i++) {
			classes.add(Class.forName(classNames.get(i)));
		}
		
		return classes;
	}
	
	public static List<String> getClassNames(Enumeration<URL> enumeration, String packageName) {
		List<String> classNames = null;
		while (enumeration.hasMoreElements()) {
			URL url = enumeration.nextElement();
			if (url != null) {
				String type = url.getProtocol();
				if (type.equals("file")) {
					System.out.println("type : file");
					String fileSearchPath = url.getPath();
					if(fileSearchPath.contains("META-INF")) {
						System.out.println("continue + " + fileSearchPath);
						continue;
					}
					classNames = getClassNameByFile(fileSearchPath);
				} else if (type.equals("jar")) {
					try {
						System.out.println("type : jar");
						JarURLConnection jarURLConnection = (JarURLConnection)url.openConnection();
						JarFile jarFile = jarURLConnection.getJarFile();
						classNames = getClassNameByJar(jarFile, packageName);
					} catch (IOException e) {
						e.printStackTrace();
					}
				} else {
					System.out.println("type : none");
				}
			}
		}

		return classNames;
	}
	
	/*
	 * 获取项目某路径下的所有类
	 */
	public static List<String> getClassNameByFile(String fileSearchPath) {
		List<String> classNames = new ArrayList<String>();
		
		File file = new File(fileSearchPath);
		File[] childFiles = file.listFiles();
		for(File childFile : childFiles) {
			if(childFile.isDirectory()) {
				classNames.addAll(getClassNameByFile(childFile.getPath()));
			} else {
				String childFilePath = childFile.getPath();
				if (childFilePath.endsWith(".class")) {
					String className = childFilePath.substring(childFilePath.lastIndexOf("\\bin\\") + 1,
							childFilePath.length()).replaceAll("\\\\", ".");
					className = className.substring(4, className.indexOf(".class"));
					classNames.add(className);
				}
			}
		}
		
		return classNames;
	}
	
	/*
	 * 从jar包中获取某路径下的所有类
	 */
	public static List<String> getClassNameByJar(JarFile jarFile, String packageName) {
		List<String> classNames = new ArrayList<String>();
		Enumeration<JarEntry> entrys = jarFile.entries();
		while (entrys.hasMoreElements()) {
			JarEntry jarEntry = (JarEntry) entrys.nextElement();
			String entryName = jarEntry.getName();
			if(entryName.endsWith(".class")) {
				String className = entryName.replace("/", ".");
				className = className.substring(0, className.indexOf(".class"));
				classNames.add(className);
			}
			
		}
		return classNames;
	}
}

四、测试

测试代码github:https://github.com/codeHaoHao/Strategy

测试项目结构如下:

1.先测试在普通的java项目中能不能运行

运行结果非常成功!

2.测试jar包状态下的运行结果

再eclipse中把项目导出为Runnable JAR file

然后在命令框中执行,执行结果如下:

运行结果非常成功!!

3.测试在另一个项目中引入该项目jar包

将刚刚包含ClassUtils的项目打成jar

然后在另一个项目中引用:

        

运行结果:

运行结果也非常的成功!!!

 

五、结果

从测试的结果来看代码运行成功,但是这还只是代码的第一代版本,代码本身还有很多可以优化的地方,足够好的优化能让代码用到更多的地方,并且还能提升代码运行的效率。

获取JAVA接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七 八步。 本文价值在于 包扫描的原理探究和实现; 参考自https://www.cnblogs.com/wangzhen-fly/p/11002814.html https://www.cnblogs.com/heaveneleven/p/9125228.html 一、背景 项目开发中,使用Netty做服务端,保持长连接与客户端(agen... 阅读详情

相关推荐

保姆级教程:在LKD3588开发板上为RK3588添加SC2210摄像头驱动(含完整DTS配置)

本文提供了一份详细的教程,指导如何在LKD3588开发板上为RK3588处理器添加SC2210摄像头驱动,包括完整的DTS配置和内核编译步骤。教程涵盖了环境准备、驱动文件添加、DTS配置详解、内核编译与烧录、驱动测试以及常见问题排查,帮助开发者快速实现SC2210传感器在RK3588平台上的集成与优化。

weixin_42641741的博客 480

获取接口实现类

Bean工厂

hkjdkl的博客 1313

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

JAVA使用反射动态的获取接口的所有实现类(通过接口类路径)

JAVA使用反射动态的获取接口的所有实现类(通过接口类路径)

zxm18751880909的博客 1万+

基于python的电商评论文本分析

本文基于京东平台安井手抓饼2000余条评论数据,运用Python文本分析技术(包括分词、词频统计、LDA主题模型等)探究消费者评价特征。研究发现:1)产品评价聚焦口味("好吃")、性价比("一分钱")和便捷性("早餐");2)京东物流服务获得高度认可;3)销售旺季集中在11月至次年1月。分析揭示了速冻食品消费者的核心关注点,为商家优化产品与服务提供数据支持,同时展示了文本挖掘技术在电商评论分析中的实用价值。

weixin_50902344的博客 8347

告别手绘!用Aseprite+Unity Tilemap,从AI生成到2D游戏地图的保姆级搭建流程

本文详细介绍了如何利用Aseprite和Unity Tilemap从AI生成素材到搭建2D游戏地图的完整流程。涵盖AI生成素材的预处理、图层管理、动画制作,以及Unity中的Tilemap系统配置和性能优化技巧,帮助开发者高效创建像素风游戏地图。

weixin_29015483的博客 583

java 根据接口获取所有的实现类

java 反射中没有直接提供给我们方法来根据接口获取所有实现的类,所以要自己去写,网上资料也很多,根据通过ClassLoader获取当前工作目录,对目录下的文件进行遍历扫描。 大致思路: 1) 获取当前线程的ClassLoader 2) 通过ClassLoader获取当前工作目录,对目录下的文件进行遍历扫描。 3) 过滤出以.class为后缀的类文件,并加载类到list中 4) 对list中所有类进行校验,判断是否为指定接口的实现类,并排除自身。 5) 返回所有符合条件的类。 这个思路是对的,

很多时候犯错都是在不知情的情况下发生的 6477

FPGA电路设计1——芯片原理图和封装制作流程

本文详细介绍了FPGA电路板设计的学习过程,以Xilinx Kintex-7系列FPGA为例。主要内容包括:1)从官网下载芯片引脚分配文件的方法;2)原理图库绘制流程,重点讲解Bank划分(配置Bank、HR/HP IO Bank、高速收发器Bank)及利用Excel预处理数据;3)使用Altium Designer的Symbol Wizard工具实现引脚自动化导入;4)原理图设计要点,包括电源系统设计(多电压需求与上电时序)、配置电路(JTAG/Flash接口)和时钟设计。

在读研究生,FPGA电路设计与功能开发。 1384

java获取当前接口生效的实现类_java找到指定接口的实现类

一、背景想在自己开发的项目上加一个算法工具类用来整合不同的算法,并且要求低耦合符合开闭原则,于是想到了《大话设计模式》里的策略模式,但是书中的策略模式还没有达到完全符合开闭原则,同时我在文章结尾看见说可以运用反射机制来大幅降低代码的耦合度,因此开始在学习如何实现,在学习过程中发现需要写一个方法用来找到指定接口的实现类,因此开启了这趟学习之旅。策略模式改进文章:通过反射机制实现一个完美的策略模式二、...

weixin_32775495的博客 1975

6、线性时序逻辑到确定性自动机的翻译

本博文详细介绍了将线性时序逻辑(LTL)转化为确定性自动机的理论基础、技术方法和实际应用。内容涵盖LTL的基本运算符、确定性自动机的特点及其在模型检测中的作用,以及具体的翻译步骤与优化策略。通过实际案例展示了如何利用这一技术进行系统属性验证,并探讨了翻译过程中可能遇到的挑战及解决方案。

gpu4optimizer的博客 150

STM32外部中断EXTI原理与飞控实时应用实战

外部中断(EXTI)是嵌入式系统中实现事件驱动和实时响应的核心机制,其本质是将外部电平变化转化为可调度的CPU中断事件。基于ARM Cortex-M NVIC架构,EXTI通过GPIO-EXTI-NVIC三级硬件通路实现低延迟信号捕获,具备边沿触发、优先级管理与挂起控制等关键能力。在四轴飞控、工业传感器、人机交互等对毫秒级响应有强需求的场景中,EXTI显著优于轮询方式,兼顾实时性与CPU资源效率。实际开发需严格遵循SYSCFG映射→EXTI配置→NVIC使能的时序逻辑,并规避常见陷阱如中断号误配、伪触发、低

weixin_36382073的博客 65

获得指定接口的所有实现类(实现类需位于接口所在的包或其子包中)

1 关键代码位于“ClassUtils.java”中,如下所示 package com.cbf4life; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java

Justin的专栏 1026

libVLC 视频抓图

libVLC 中通过libvlc_video_take_snapshot核心接口来截图。以下是VLC播放器中使用的截图界面,我们仿照这个做一个界面。首先,你需要初始化 libVLC 实例和媒体播放器对象。1. 初始化 libVLC 和媒体播放器。菜单添加action,并响应槽函数。生成目录下snap.png。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1940

JAVA-获取实现了指定接口类的所有实现类或继承了指定类的所有子类

实际编程过程中,我们可能遇到这样的问题,就是获取实现了指定接口类的所有实现类。 本工具类就提供了这样的功能。下面是工具类的详细解析: /** * 查找指定路径下面实现指定接口的全部类 * @author longyin * @author 博客地址:http://blog.youkuaiyun.com/u010156024 * 如果大家有什么问题或疑问,欢迎留言或评论,谢谢!! */ publi

nyyin@qq.com 2万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

给一个接口返回这个接口的所有实现类

在Java中,给一个接口,返回这个接口的所有实现类。代码来源:设计模式之禅

xupingwei 957

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java:反射获取Package下接口的全部实现类

java:反射获取Package下接口的全部实现类。

a232884c的博客 758

通过反射机制获取位于同一个包下的接口的所有实现类

通过反射机制获取位于同一个包下的接口的所有实现类   public class ClassUtils {    public static List getAllImplClassesByInterface(Class c) {      // 给一个接口,返回这个接口的所有实现类      List returnClassList = new ArrayList();// 返回结

jiang123986的博客 4415

spring 到底注入接口还是实现类?

今天半夜写代码时把@Repository注解写在了接口上,导致bean无法完成注入。 这其实都是spring的内容,可能是半夜脑子不好使,一直没看出来哪里的问题。 关于上面的问题的解释: @Service注解是标注在实现类上的,因为@Service是把spring容器中的bean进行实例化,也就是等同于new操作,只有实现类是可以进行new实例化的,而接口则不能,所以是加在实现类上的。 问题1:spring 到底注入接口还是实现类? 实现类 在最初学习spring时,我们使用的时配置的方式来实现。 大概是这

m0_53957485的博客 2328

接口工具类

最近看《我们设计的模式》一书,在看到工厂模式那一章节,看到一个很好的工具类,在当前工程中找到给定接口的所有实现类,与大家分享下。 public class ClassUtil { /** * 获取给定接口的所有实现类 * @param c * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) p

luoyulq的专栏 557

java.util.ServiceLoader的用法

在很多开源组件里经常会看到java.util.ServiceLoader的使用,这里给大家介绍下怎么通过ServiceLoader找到一个接口的所有实现类。 我们新建一个接口Hello public interface Hello { String say(); } 然后创建一个实现类DefaultHello public class DefaultHello implements...

weixin_33713350的博客 160

一个接口多个实现类,如何指定特定实现类进行调用

一个接口多个实现类,如何指定特定实现类进行调用示例解决方法 在写程序的时候经常会遇到 写一个接口有多个实现类,那么在调用的时候是如何去确定调用的是哪个实现类呢?接下来将为你介绍几种方式: 示例 总接口 public interface Animal { //动物的叫声 public void call(); //动物吃的东西 public void eat(); } 实现类1 @Service("dogImpl") public class Dog implements An

渡灬魂的博客 1万+

Java——接口与实现类

目录接口实现接口 接口 使用关键字interface来定义一个接口。定义接口包含接口声明和接口体 接口体:常量声明(final)和抽象方法(abstract)。             (没有变量,没有普通方法) 所有常量的访问权限一定都是public,且为static常量。 所有抽象方法的访问权限一定都是public。 interface Printable{ public static

guochaoHNU的博客 2万+

Mybatis Mapper接口如何找到实现类

1、前言        MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。我们在使用 Mybaits 进行开发 ,通常只需要定义几个 Mapper 接口,然后在编写一个 xml 文件,我们在配置文件中写好 sql , Mybatis 帮我们完成 M...

Vincent2014Linux 2766

java 接口 对象 = new 实现类 与 实现类 对象= new 实现类

今天我们讨论问题是:接口 对象 = new 实现类 与 实现类 对象= new 实现类??? Java 中到底是应该用接口类型 还是实现类的类类型去引用对象? //implA 为接口 ClassA为其实现类 implA a=new ClassA();//接口类型的引用变量A 去接收对象地址 or ClassA a=new ClassA();//类类型的引用变量A 去接...

dehu2510的博客 9054

【Java】—— 集合框架:List接口常用方法与List接口的实现类

举例:List集合存储数据,就像银行门口客服,给每一个来办理业务的客户分配序号:第一个来的是“张三”,客服给他分配的是0;) 方法返回的 List 集合,既不是 ArrayList 实例,也不是 Vector 实例。注意:在JavaSE中List名称的类型有两个,一个是java.util.List集合接口,一个是java.awt.List图形界面的组件,别导错包了。定义学生类,属性为姓名、年龄,提供必要的getter、setter方法,构造器,toString(),equals()方法。

weixin_63106307的博客 2150
上一篇: Git分支命名规范
下一篇: 通过反射机制实现一个完美的策略模式
Mr.LiJiaHao
博客等级 码龄10年 27粉丝 30原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值