先定义一个需要被introduce的interface
java 代码
- public interface EditAware {
-
- public Object getOldValue(String propertyName);
-
- public boolean isEdited(String propertyName);
-
- }
再写这个interface的mixin
java 代码
- import org.aopalliance.intercept.MethodInvocation;
- import org.apache.commons.beanutils.PropertyUtils;
- import org.apache.commons.lang.StringUtils;
- import org.springframework.aop.support.DelegatingIntroductionInterceptor;
-
- public class EditAwareMixin extends DelegatingIntroductionInterceptor implements
- EditAware {
-
- private transient Map map = new HashMap();
-
- public Object getOldValue(String propertyName) {
- return map.get(propertyName);
- }
-
- public boolean isEdited(String propertyName) {
- return map.containsKey(propertyName);
- }
-
- public Object invoke(MethodInvocation invocation) throws Throwable {
- if (invocation.getMethod().getName().indexOf("set") == 0) {
- Object _this = invocation.getThis();
- String propertyName = invocation.getMethod().getName().substring(3);
- propertyName = StringUtils.uncapitalize(propertyName);
- Object oldValue = PropertyUtils.getProperty(_this, propertyName);
- Object newValue = invocation.getArguments()[0];
- if (!isEquals(oldValue, newValue))
- map.put(propertyName, oldValue);
- }
- return super.invoke(invocation);
- }
-
- public static boolean isEquals(Object oldValue, Object newValue) {
- if (oldValue == null && newValue == null)
- return true;
- if (oldValue != null)
- return oldValue.equals(newValue);
- else
- return newValue.equals(oldValue);
- }
- }
最后是怎么使用这个mixin
java 代码
- import org.springframework.aop.framework.ProxyFactory;
- import org.springframework.beans.BeanUtils;
-
- public class Main {
-
- public static void main(String[] args) {
- User u1 = new User("username1", "password1");
- User u2 = new User("username2", "password2");
- ProxyFactory pc = new ProxyFactory();
- pc.setProxyTargetClass(true);
- pc.setTargetClass(u1.getClass());
- pc.addAdvice(new EditAwareMixin());
- pc.setTarget(u1);
- u1 = (User) pc.getProxy();
- BeanUtils.copyProperties(u2, u1);
- EditAware ea = (EditAware) u1;
- System.out.println(ea.isEdited("username"));
- System.out.println(ea.getOldValue("username"));
- }
-
- public static class User {
- private String username;
- private String password;
-
- public User() {
-
- }
-
- public User(String username, String password) {
- this.username = username;
- this.password = password;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- }
- }
分享到:
相关推荐
Mixin允许你定义一组可以重复使用的样式,类似于函数,通过`@include`语句来调用。这在处理复杂或频繁复用的样式时非常有用,但它仍然需要编译为普通的CSS,增加了额外的步骤。 CSS自定义属性,另一方面,是在CSS...
Mixin框架是Java编程语言中的一个开源项目,它利用ASM库来实现对类的低级别修改,也就是所谓的"混合"(Mixins)。这个框架的核心概念是将功能或行为注入到目标类中,而无需继承或者使用代理模式。在游戏开发、模块化...
本示例项目"forge-mixin-example"就是针对Minecraft Forge 1.12.2版本,展示如何有效地使用Mixin进行模组开发。 首先,理解Forge的基本概念至关重要。Forge提供了一个API,让开发者可以安全地与Minecraft的运行时...
在微信小程序的开发中,`mixin` 是一种常见的代码复用机制,它允许开发者定义一组通用的方法或者属性,然后将这些通用部分混入(mix in)到不同的页面(Page)或组件(Component)中,避免了代码重复,提高了代码的...
然后,在需要应用这个样式的类或元素中,你可以使用`@include`来调用`mixin`: ```scss .my-class { @include my-mixin(red); } ``` 当编译这段SCSS代码时,它将被转换为CSS: ```css .my-class { color: red; ...
这里,`respond-to` mixin根据传入的屏幕断点(如'sm'、'md'、'lg')来插入相应的媒体查询,简化了响应式布局的实现。 ymixin库也可能会支持JavaScript与CSS的交互,比如通过`data-*`属性或者CSS变量来实现动态样式...
但需要注意的是,使用mixin也可能导致代码难以追踪,因为mixin中的逻辑可能会影响到使用它的组件,特别是在mixin和组件中定义了相同命名的属性和方法时。 Vue官方推荐,如果mixin中包含同名的钩子函数,最好将这些...
mixin是一个闪电交易快速的点点对的数字交道项目,它拥有非常好的技术栈。
局部混入定义一个 Mixin 对象,有组件 options 的 data、methods 属性,然后将其传入组件的 mixins 选项中。例如: ```javascript var myMixin = { created: function () { this.hello() }, methods: { hello:...
mixin混入来封装axios请求 我们通过mixin来封装axios请求这样每一个组件直接通过混入来进行axios请求。 不必每次需要时都要import引入一次 首先需要下载axios的包 //用npm、cnpm或者yarn都行 npm install axios ...
A Swift mixin for UITableViewCells and UICollectionViewCells.zip,A Swift mixin for reusing views easily and in a type-safe way (UITableViewCells, UICollectionViewCells, custom UIViews, ViewControllers...
css-vars:将CSS自定义属性与Sass一起使用安装使用npm: npm install css-vars 与纱线: yarn add css-vars 使用Bower: bower install css-var 手动:获取使用@import语句在项目中包含主mixin文件: @import " [%...
$ grunt docs构建文档还有一个Grunt任务: $ grunt sassdoc测验可以从出色的获得测试,并且可以使用以下方式运行测试: $ grunt test原料药基本API 有mixin可以覆盖所有box属性,既可以接受多个参数的属性,也可以...
modernizr-mixin, 在Sass中,针对测试的简单而全面的mixin hardwarebutton混合 一种简单的DRYier测试方法,在Sass中更快更。安装要求 ruby 3.4或者 LibSass 3.2Libsass警告:在 Libsass 3.2.3中有一个已知 Bug,它...
Mixin模式是一种在python里经常使用的模式,适当合理的应用能够达到复用代码,合理组织代码结构的目的。 Python的Mixin模式可以通过多继承的方式来实现, 举例来说,我们自定义一个简单的具有嵌套结构的数据容器: ...
Vue mixin 混入允许开发者定义一组属性,包括选项如数据、方法、生命周期钩子等,然后这些属性可以被多个组件继承。当你创建一个组件时,Vue会自动将所有混入对象中的属性合并到该组件的选项中。如果两个混入或组件...
这样,通过创建Author的实例并调用其方法时,就可以看到它已经成功继承了Editor类的hello方法,但是其自身的属性如name和books并没有改变。 最后,文档提到了一些与JavaScript相关的高级主题,包括函数技巧、面向...
总的来说,“react-addons-pure-render-mixin”是React优化性能的一种手段,通过比较props和state来决定是否需要组件重新渲染。随着React的发展,虽然它已不再是最新的解决方案,但理解其工作原理对于优化React应用...