reflection4j
一个用于反射调用Java对象的工具包,提取自mybatis,并进改造 1.提供对某一个类或者对象的包装,可返回某一方法的执行器,并能够执行 2.提供包路径下类的扫描 3.提供包路径下资源的加载 4.提供类的别名管理 5.拓展点加载器,提取自dubbo,同时根据实际需要进行了改造
<dependency>
<groupId>com.rnkrsoft.reflection4j</groupId>
<artifactId>reflection4j</artifactId>
<version>最新版本号</version>
</dependency>
拓展点加载器
提取自dubbo,保留懒加载实例化和包装实现,去除@Activate和@Adaptive。增加@Wrapper注解,对包装实例进行排序定义
拓展点接口定义
package com.rnkrsoft.reflection4j.extension;
/**
* Created by rnkrsoft.com on 2019/8/23.
*/
@SPI("cn")
public interface DemoService {
String say();
}
拓展点实现1
package com.rnkrsoft.reflection4j.extension;
/**
* Created by rnkrsoft.com on 2019/8/23.
*/
public class CnDemoService implements DemoService{
@Override
public String say() {
return "你好!";
}
}
拓展点实现2
package com.rnkrsoft.reflection4j.extension;
/**
* Created by rnkrsoft.com on 2019/8/23.
*/
public class EnDemoService implements DemoService{
@Override
public String say() {
return "Hello!";
}
}
在META-INF/extensions/下创建文件com.rnkrsoft.reflection4j.extension.DemoService
cn=com.rnkrsoft.reflection4j.extension.CnDemoService
en=com.rnkrsoft.reflection4j.extension.EnDemoService
调用代码
@Test
public void testGetExtensionLoader() throws Exception {
ExtensionLoader<DemoService> extensionLoader = ExtensionLoader.getExtensionLoader(DemoService.class);
DemoService demoService1 = extensionLoader.getExtension("cn");
String say1 = demoService1.say();
Assert.assertEquals("你好!", say1);
DemoService demoService2 = extensionLoader.getExtension("en");
String say2 = demoService2.say();
Assert.assertEquals("Hello!", say2);
}
通过以上代码实现按需加载拓展点实现。 可参照https://www.cnblogs.com/Non-Tecnology/p/6882903.html
包装增强拓展点
在前面的基础上定义如下类
package com.rnkrsoft.reflection4j.extension;
/**
* Created by rnkrsoft.com on 2019/8/24.
*/
@Wrapper(priority = 1)
public class Wrapper1DemoService implements DemoService{
DemoService instance;
public Wrapper1DemoService(DemoService instance){
this.instance = instance;
}
@Override
public String say() {
System.out.println("Wrapper1DemoService before");
String value = instance.say();
System.out.println("Wrapper1DemoService return");
return value;
}
}
package com.rnkrsoft.reflection4j.extension;
/**
* Created by rnkrsoft.com on 2019/8/24.
*/
@Wrapper(priority = 2)
public class Wrapper2DemoService implements DemoService{
DemoService instance;
public Wrapper2DemoService(DemoService instance){
this.instance = instance;
}
@Override
public String say() {
System.out.println("Wrapper2DemoService before");
String value = instance.say();
System.out.println("Wrapper2DemoService return");
return value;
}
}
在
在META-INF/extensions/下创建文件com.rnkrsoft.reflection4j.extension.DemoService
cn=com.rnkrsoft.reflection4j.extension.CnDemoService
en=com.rnkrsoft.reflection4j.extension.EnDemoService
x2=com.rnkrsoft.reflection4j.extension.Wrapper2DemoService #新增加的
x1=com.rnkrsoft.reflection4j.extension.Wrapper1DemoService #新增加的
调用代码验证
@Test
public void testGetExtensionLoader2() throws Exception {
ExtensionLoader<DemoService> extensionLoader = ExtensionLoader.getExtensionLoader(DemoService.class);
extensionLoader.getExtension("cn");
DemoService demoService1 = extensionLoader.getExtension();
String say1 = demoService1.say();
Assert.assertEquals("你好!", say1);
}
执行后,界面输出
Wrapper2DemoService before
Wrapper1DemoService before
Wrapper1DemoService return
Wrapper2DemoService return