为了提高运行效率,objot采用了bytecode(字节码)生成的方式,即在原有的服务类的方法中插入一些代码而形成一个子类,但在外界看起来还是原有的类。下面我们来看一下Weaver的强大功能。
还是以第二篇的例子,假设DoUser的operate方法的调用需要有权限控制,而像这种控制在很多地方都可能会有,我们不会手动在每个方法添加大量权限判断的代码(与业务无关的代码),因为我们有Weaver,它会帮我们处理好这些事情。
//DoUser.java文件
package objot.sample.service;
import objot.container.Inject;
/**
* 用户服务
* @author adun
*/
public class DoUser extends Do {
/**
* 为了方便演示,我们假设调用者的权限代码为1
*/
public int permit = 1;
/**
* 被注入的DoBiz
*/
@Inject
public DoBiz db;
/**
* 具有权限0的调用者可以调用本方法
*/
@Sign(permit = 0)
public void operate() {
db.doSth();
}
}
由于DoBiz没有任何变化,我们就不在这里再贴同样的代码了,请参见第二篇。我们主要再来看一下@Sign(意为“登录信息”)的定义:
//Sign.java文件
package objot.sample.service;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import objot.aspect.Aspect;
/**
* 登录信息标记
* @author adun
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Sign {
/**
* 权限
*/
int permit();
/**
* 对于权限的处理逻辑类,代码将会被织入到DoUser.operate方法中
* @author 司马春雪
*
*/
public static final class As extends Aspect {
@Override
protected void aspect() throws Throwable {
//得到被@Sign标志的方法所属的类
DoUser du = Target.thiz();
//得到标志的实例
Sign sign = Target.data();
//判断权限是否相等
if (du.permit != sign.permit()) {
throw new Exception("您没有这个权限");
}
//调用方法,即调用DoUser.operate
Target.invoke();
}
}
}
这样一来,我们的定义工作都做完了,接下来我们要“织布”了^_^!
//Sample.java文件
package objot.sample;
import java.lang.reflect.Method;
import objot.aspect.Aspect;
import objot.aspect.Weaver;
import objot.container.Bind;
import objot.container.Container;
import objot.container.Factory;
import objot.sample.service.Do;
import objot.sample.service.DoUser;
import objot.sample.service.Sign;
import objot.util.Class2;
import objot.util.Mod2;
/**
* 示例主程序
* @author adun
*/
public class Sample {
public static void main(String[] args) throws Exception {
//新建一个织入器,并将Sign.As织入
final Weaver w = new Weaver(Sign.As.class) {
@Override
protected Object forWeave(Class<? extends Aspect> a, Method m) throws Exception {
//判断aspect类是否为Sign.As并且织入目标类的方法被Sign标记过
if (a == Sign.As.class && m.getAnnotation(Sign.class) != null) {
return m.getAnnotation(Sign.class);
}
return this;
}
};
//新建容器工厂,为了将服务类在织入后再放入容器中,我们需要对Factory进行自定义
Factory factory = new Factory() {
{
for(Class<?> c : Class2.packageClasses(Do.class)) {
//只绑定继承于Do(或Do本身)并且非抽象类到容器中
if (!Mod2.match(c, Mod2.ABSTRACT) && Do.class.isAssignableFrom(c)) {
bind(c);
}
}
}
/**
* 绑定前的预处理,即我们要对服务类织入代码后再绑定到容器
*/
@Override
protected Object forBind(Class<?> c, Bind b) throws Exception {
//判断要绑定的类是否是我们通过编译器引入的(即不需要再进行织入操作)
//否则要对c进行织入操作
return c.isSynthetic() ? b : b.cla(w.weave(c));
}
};
//生成容器c,c的父容器为null
Container c = factory.create(null);
//开始从容器中得到一个DoUser的实例
DoUser du = c.get(DoUser.class);
//执行
du.operate();
}
}
执行结果:
Exception in thread "main" java.lang.Exception: 您没有这个权限
at objot.sample.service.Sign$As$$23105029$objot$sample$service$DoUser.operate(Sign.java:35)
at objot.sample.Sample.main(Sample.java:58)
因为du的permit为1,而要执行operate需要permit为0,那么将DoUser.permit改为0再试一下,就会得到如下结果:
开始操作
是不是有点好玩呢?个人认为这里面强大的且难于理解的是字节码的生成,即通过对类进行“暴力”修改而得到的新的子类,会极大提高运行效率(相对于反射机制)。有兴趣的朋友可以看一下objot字节码生成部分的源代码,我就不再介绍了(主要是我喜欢用好东西,而不是喜欢研究原理,哈哈~~)。
我先去做点项目的工作了,不做项目没饭吃啊……有点小郁闷
分享到:
相关推荐
人才招聘网站 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
EI复现:碳减排背景下综合能源服务商合作策略的纳什谈判理论与自适应交替方向乘子法求解,EI复现: 《考虑碳减排的综合能源服务商合作运行优化策略》 纯手工复现,主要通过纳什谈判理论进行博弈,并采用自适应交替方向乘子法进行分布式求解 ,核心关键词:EI复现; 碳减排; 综合能源服务商; 合作运行优化策略; 纳什谈判理论; 博弈; 自适应交替方向乘子法; 分布式求解,EI复现:纳什谈判理论下的碳减排能源服务商合作运行优化策略
一种高精度太阳能跟踪控制系统设计与实现.pdf
基于AHP-CRITIC组合变权与指标劣化度修正的赋权方法研究,38考虑劣化度APH-CRITIC组合变权 组合变权赋权方法,基于AHP和改进CRITIC计算主客观权重,引入指标劣化度构造变权函数对综合权重进行修正,还方法可以捕捉指标时序的劣化程度,实现数据的有效跟踪,评价更加合理。 可根据需求进行改进。 ,关键词:组合变权赋权方法;AHP;CRITIC;指标劣化度;变权函数;时序劣化程度;数据跟踪;评价合理。,基于AHP-CRITIC组合变权法:综合主客观权重与指标劣化度评价
"深入解析:车桥耦合程序,全注释代码与ANSYS及MATLAB联合应用,集车辆、桥梁模型与路面不平整度于一身的仿真系统",车桥耦合程序,每行代码都有注释 ansys 和matlab联合使用 车辆模型,桥梁模型和路面不平整度已写入程序 提供参考文章 桥梁模型可根据自己的模型修改。 ,车桥耦合程序;ANSYS;Matlab联合使用;车辆模型;桥梁模型;路面不平整度;模型修改,"ANSYS-Matlab车桥耦合程序,详解与优化"
基于MATLAB的SVM算法与颜色纹理分析的交通信号灯识别系统,MATLAB代码:SVM+颜色+纹理的交通信号灯识别。 ,SVM; 颜色识别; 纹理识别; 交通信号灯识别,MATLAB SVM算法:交通信号灯颜色与纹理识别
基于S7-200 PLC与组态王技术的切片机控制系统设计优化与实践应用,No.791 基于S7-200 PLC和组态王组态切片机控制系统设计 ,基于S7-200 PLC; 组态王组态; 切片机控制系统设计; 791号项目,基于PLC与组态王设计的切片机控制系统设计No.791
《pfc2D颗粒流软件及其在裂纹声发射监测中的应用研究》,pfc2D颗粒流软件,裂纹声发射监测 ,pfc2D; 颗粒流软件; 裂纹; 声发射监测; 监测技术,"PFC2D颗粒流软件在裂纹声发射监测中的应用"
"10kW双级式光伏并网逆变器Matlab仿真研究:前级Boost升压与后级DC-AC逆变控制策略的稳定性与波形分析",10kW双级式光伏并网逆变器matlab仿真 【1】前级boost升压+后级DC AC逆变; 【2】前级使用mppt最大功率追踪,输出最大功率电压; 【3】后级使用dq轴双闭环控制:外环直流电压环+内环电感电流环; 【4】10kHz开关频率,使用离散仿真,更模拟实际工况; 【5】在光伏波动的情况下依然可以稳定运行,具体波形如图所示。 【6】送一份5页的简单说明文档。 ,核心关键词: 1. 10kW双级式光伏并网逆变器 2. 前级boost升压+后级DC AC逆变 3. MPPT最大功率追踪 4. DQ轴双闭环控制 5. 10kHz开关频率 6. 离散仿真 7. 光伏波动 8. 稳定运行 9. 波形 10. 说明文档,Matlab仿真研究:10kW双级式光伏并网逆变器及其控制策略
基于西门子1200博图v15.1版本的单部四层自动化系统:全功能集成的真实运行仿真体验,单部四层,基于西门子1200博图v15.1版本 可直接仿真运行,视频就是真实运行画面,功能集全 ,核心关键词:单部四层; 西门子1200博图v15.1版本; 可仿真运行; 功能集全 分号分隔的结果为:单部四层; 西门子1200博图v15.1版本; 可直接仿真运行; 功能集全;,"西门子1200博图V15.1四层仿真系统,功能全面真实运行"
基于GPU的海战场环境研究.pdf
FPGA驱动双目视觉系统:立体匹配、视差图与深度图生成技术的研究与应用,FPGA双目视觉 立体视觉 视差图 深度图 双目立体匹配sgm sgbm tang 20k 高云fpga usb摄像头采集图像 ,FPGA双目视觉;立体视觉;视差图;深度图;双目立体匹配sgm;sgbm;高云FPGA;USB摄像头图像采集。,基于FPGA的双目视觉系统:立体匹配与深度图生成
MIM结构超表面全息技术:高效率、几何相位与FDTD仿真的综合案例研究,MIM结构 高效率超表面全息 几何相位 fdtd仿真 复现:2015年Nature nanotechnology : Metasurface holograms reaching 80% efficiency 介绍:MIM金Au-MgF2-金Au结构 纳米天线 激发磁偶极子模式,具有超高效率,纳米柱由几何相位设计,实现高效相位调制模式; 案例内容:主要包括金Au纳米天线单元结构仿真、几何相位计算,转效率计算,画图脚本,Gs算法设计全息相位,超表面全息仿真模型及脚本计算等 案例包括fdtd模型、fdtd设计脚本、GS算法的Matlab计算代码和结果,以及一份word教程,MIM结构仿真结果与文献完全一致,可以用于其他功能超表面的设计; ,MIM结构; 高效率超表面全息; 几何相位; fdtd仿真; metasurface holograms; 金Au纳米天线; 磁偶极子模式; 纳米柱; 超表面设计。,MIM结构超表面全息:高效率、几何相位与FDTD仿真案例研究
自习室座位预约系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
基于太赫兹硅脊波导阵列的拓扑零模 式研究.pdf
Matlab在非线性微分方程数值模拟中的多维应用:涵盖平衡点曲线、势能曲线、相图与势阱图、时程曲线分析、庞加莱截面及分岔图与功率谱密度曲线的综合研究,Matlab求解非线性微分方程进行数值模拟,包括 1.平衡点曲线(可以三维图);2.势能曲线(可以三维图);3.相图和势阱图(三维);4.时程曲线分析;5.相图分析;6.庞加莱截面;7.分岔图;8.功率谱密度曲线等。 ,关键词:Matlab;非线性微分方程;数值模拟;平衡点曲线(三维图);势能曲线(三维图);相图和势阱图(三维);时程曲线分析;庞加莱截面;分岔图;功率谱密度曲线。,Matlab微分方程多维度模拟研究
基于Matlab GUI界面的动态手势识别系统:支持向量机SVM的机器学习应用与拓展,- 标题: 基于Matlab的动态手势识别 - 关键词:matlab GUI界面 动态手势识别 SVM 支持向量机 机器学习 手势数据集 - 步骤: - 动态检测:打开相机 载入数据库 获取当前帧 截取需要区域 识别手势 显示在GUI上 - 简述:支持检测图片,支持实时打开相机检测,机器学习算法识别率高,可识别1到10个手势,如需其他手势可自行训练拓展。 ,matlab GUI界面; 动态手势识别; SVM; 机器学习; 手势数据集; 动态检测; 实时相机检测; 识别率高,基于Matlab GUI的动态手势识别系统:SVM支持向量机算法高效识别
基于机器 学习的高层 建筑风荷载功率谱 预测算法研究.pdf
matlab实现ELM分类完整程序+数据
"变焦技术下的光学系统设计与应用:变焦物镜、变焦投影物镜及变焦扩束镜的集成研究",变焦光学系统、变焦物镜、变焦投影物镜、变焦扩束镜 ,核心关键词:变焦光学系统; 变焦物镜; 变焦投影物镜; 变焦扩束镜;,光学系统:变焦物镜与扩束镜应用