- 实现基础
- 需要生产的对象类需要实现某个基础接口,例子中实现的是LocalService
- 只会生成继承接口的实现类对象
- 接口
public interface LocalService {
void initialize();
}
- 实现类
public class LocalConferenceScheduleService implements LocalService {
@OverWrite
void initialize(){};
}
- 添加依赖
<!--反射框架依赖-->
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections-spring</artifactId>
<version>0.9.9-RC1</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
- 该工具类可以获取某个接口下所有实现类的类对象(Class类)、
import com.huawei.smc.esdk.service.LocalService;
import org.reflections.Reflections;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class ConfigUtil {
// 初始化方法名称
private static final String INIT_METHOD_NAME = "initialize";
// 要扫描的包名
private static final String PACKAGE_NAME = "com.huawei.smc.esdk.service.local";
//test测试
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
List<Class> list = getConfigList();
for (Class name : list) {
System.out.println(name.getName());
//初始化
//manualInitialize(name);
}
}
/**
* 获取所有模块名称
*
* @return
*/
public static List<String> getConfigNameList() {
List<String> nameList = new ArrayList<String>();
Reflections reflections = new Reflections(PACKAGE_NAME);
Set<Class<? extends LocalService>> monitorClasses = reflections.getSubTypesOf(LocalService.class);
if (monitorClasses != null) {
for (Class<? extends LocalService> config: monitorClasses) {
boolean isAbstract = Modifier.isAbstract(config.getModifiers());
//过滤抽象类
if (!isAbstract) {
nameList.add(config.getName());
}
}
}
return nameList;
}
/**
* 获取所有实现
*
* @return
*/
public static List<Class> getConfigList() {
List<Class> moduleList= new ArrayList<Class>();
Reflections reflections = new Reflections(PACKAGE_NAME);
Set<Class<? extends LocalService>> monitorClasses = reflections.getSubTypesOf(LocalService.class);
if (monitorClasses != null) {
for (Class<? extends LocalService> config : monitorClasses) {
boolean isAbstract = Modifier.isAbstract(config.getModifiers());
if (!isAbstract) {
moduleList.add(config);
}
}
}
return moduleList;
}
/**
* 调用初始化方法
*
* @param fullClassName 全限定名
*/
@SuppressWarnings("unchecked")
public static void manualInitialize(String fullClassName) {
try {
Class clazz = Class.forName(fullClassName);
Constructor[] constructors = clazz.getDeclaredConstructors();
AccessibleObject.setAccessible(constructors, true);
for (Constructor con : constructors) {
if (con.isAccessible()) {
Object classObject = con.newInstance();
Method method = clazz.getMethod(INIT_METHOD_NAME);
method.invoke(classObject);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- Factory工厂类
import java.util.List;
public class ServiceFactoryEx {
public static <T> T getService(Class<? extends T> interfaceClass) {
T t = null;
List<Class> classes = ConfigUtil.getConfigList();
try {
for (Class clazz : classes) {
if (interfaceClass.equals(clazz)){
t = (T)Class.forName(interfaceClass.getName()).newInstance();
}
}
if (t == null){
throw new Exception("Class not found");
}
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
- 测试
import org.junit.Test;
public class FactoryTest {
@Test
public void FactoryTest() {
LocalConferenceScheduleService service
= ServiceFactoryEx.getService(LocalConferenceScheduleService.class);
System.out.println(service.getClass().getName());
}
}
-
测试结果
-
注意
获取的对象不是单例