利用Map创建Copy Object

定义上下文行为,要继承Map

package com.wjz.core;

import java.io.Serializable;
import java.util.Map;

public interface CustomSubjectContext extends Map<String, Object> {

    void setSessionId(Serializable sessionId);

    Serializable getSessionId();

    void setAuthenticated(Boolean authc);

    Boolean isAuthenticated();
}

定义MapContext上下文,定义备份Map,实现备份Map的存取等关乎map的行为,实现Map

package com.wjz.core;

import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.springframework.util.CollectionUtils;

public class CustomMapContext implements Map<String, Object>, Serializable {

    private static final long serialVersionUID = 6611136447999868186L;

    private final Map<String, Object> backingMap;

    public CustomMapContext() {
        backingMap = new HashMap<String, Object>();
    }

    public CustomMapContext(Map<String, Object> map) {
        this();
        if (!CollectionUtils.isEmpty(map)) {
            this.backingMap.putAll(map);
        }
    }

    @Override
    public int size() {
        return backingMap.size();
    }

    @Override
    public boolean isEmpty() {
        return backingMap.isEmpty();
    }

    @Override
    public boolean containsKey(Object key) {
        return backingMap.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value) {
        return backingMap.containsValue(value);
    }

    @Override
    public Object get(Object key) {
        return backingMap.get(key);
    }

    @Override
    public Object put(String key, Object value) {
        return backingMap.put(key, value);
    }

    @Override
    public Object remove(Object key) {
        return backingMap.remove(key);
    }

    @Override
    public void putAll(Map<? extends String, ?> m) {
        backingMap.putAll(m);
    }

    @Override
    public void clear() {
        backingMap.clear();
    }

    @Override
    public Set<String> keySet() {
        return Collections.unmodifiableSet(backingMap.keySet());
    }

    @Override
    public Collection<Object> values() {
        return Collections.unmodifiableCollection(backingMap.values());
    }

    @Override
    public Set<Entry<String, Object>> entrySet() {
        return Collections.unmodifiableSet(backingMap.entrySet());
    }

    protected void nullSafePut(String key, Object value) {
        if (value != null) {
            put(key, value);
        }
    }

    @SuppressWarnings("unchecked")
    protected <E> E getTypeValue(String key, Class<E> type) {
        E val = null;
        Object result = backingMap.get(key);
        if (result != null) {
            if (!type.isAssignableFrom(result.getClass())) {
                // 类型不正确
            }
            val = (E) result;
        }
        return val;
    }

}

定义默认的上下文实现类,继承MapContext上下文,具体实现上下文

package com.wjz.core;

import java.io.Serializable;

public class DefaultCustomSubjectContext extends CustomMapContext implements CustomSubjectContext {

    private static final long serialVersionUID = -273450905542274017L;

    private static final String SESSION_ID = ".SESSION_ID";

    private static final String AUTHC = ".AUTHC";

    public DefaultCustomSubjectContext() {
        super();
    }

    public DefaultCustomSubjectContext(CustomSubjectContext sctx) {
        super(sctx);
    }

    @Override
    public void setSessionId(Serializable sessionId) {
        nullSafePut(SESSION_ID, sessionId);
    }

    @Override
    public Serializable getSessionId() {
        return getTypeValue(SESSION_ID, Serializable.class);
    }

    @Override
    public void setAuthenticated(Boolean authc) {
        nullSafePut(AUTHC, authc);
    }

    @Override
    public Boolean isAuthenticated() {
        return getTypeValue(AUTHC, Boolean.class);
    }

}

demo

package com.wjz.demo;

import com.wjz.core.CustomSubjectContext;
import com.wjz.core.DefaultCustomSubjectContext;

public class CopyDemo {

    public static void main(String[] args) {
        CustomSubjectContext sctx = new DefaultCustomSubjectContext();
        sctx.setSessionId("sctx 123456");
        sctx.setAuthenticated(true);
        System.out.println("sctx getSessionId :" + sctx.getSessionId());
        System.out.println("sctx isAuthenticated :" + sctx.isAuthenticated());
        System.out.println();
        CustomSubjectContext copy = new DefaultCustomSubjectContext(sctx);
        copy.setSessionId("copy 123456");
        System.out.println("copy getSessionId :" + copy.getSessionId());
        System.out.println("copy isAuthenticated :" + copy.isAuthenticated());
    }
}

原文地址:https://www.cnblogs.com/BINGJJFLY/p/9101989.html

时间: 2024-10-12 10:55:05

利用Map创建Copy Object的相关文章

HTML 利用MAP创建图片中的链接的映射

<html><body> <p>请点击图像上的星球,把它们放大.</p> <imgsrc="/i/eg_planets.jpg"border="0" usemap="#planetmap"alt="Planets" /> <map name="planetmap" id="planetmap"> <areash

【cas】利用Map返回更多信息

在cas中默认获取的用户信息为登录时填写的登录用户名,但是如果我不想返回登录的用户名,返回其他的信息呢? 一.将登录用户的id作为默认值 显示 首先在cas server中找到deployerConfigContext.xml配置文件中关于认证信息配置的地方即name="credentialsToPrincipalResolvers",这里是 关于返回用户信息所对应的类.默认执行的是下面这个类. <bean class="org.jasig.cas.authentica

C#中利用委托创建窗体单向通信

初学者在开始学习的时候,对于委托很难做到一下子理解,其中也包括我.委托好比一座大山,没爬上山顶就不能有"一览众山小"的感觉,只有你真正的爬到山顶的时候,才会发现大自然的是神奇. 委托我们可以把它认为是一个类,而不是一个方法.用委托我们可以调用方法,来简化程序,非常像C++中的指针. 使用委托的一般步骤为: (1)定义委托,delegate 返回值类型 委托类型名称(参数列表): (2)声明方法: (3)实例化委托,注意声明的类型要和方法中的类型一样. 下面给出例子,利用委托创建窗体单向

解如何利用 XML 和 JavaScript Object Notation 在 Ajax 客户端和 Java 服务器之间传输数据。

2006 年 6 月发表 Ajax 核心 API(即所谓的 XMLHttpRequest)的唯一用途就是发送 HTTP 请求,在 Web 浏览器与服务器之间进行数据交换.Web 页面中运行的 JavaScript 代码,可以使用 XMLHttpRequest 将该请求参数提交至服务器端脚本,例如 Servlet 或 JSP 页面.调用的 Servlet/JSP 将发回一个响应,其中包含了一般用于不需刷新整个页面即可更新用户查看内容的数据.此种方法在性能和可用性方面均体现出了独有的优势,因为这将降

利用WPF创建含多种交互特性的无边框窗体

咳咳,标题一口气读下来确实有点累,让我先解释一下.另外文章底部有演示程序的下载. 本文介绍利用WPF创建一个含有以下特性的窗口: 有窗口阴影,比如QQ窗口外围只有几像素的阴影: 支持透明且无边框,为了自行美化窗口通常都会想到使用无边框窗口吧: 可正常最大化,WPF无边框窗口直接最大化会直接使窗口全屏即会将任务栏一并盖住: 窗口边缘改变窗口大小,可以拖动窗口边缘改变大小: 支持等同于标题栏的全窗口空白区拖动,这一特性可以参考QQ: 支持多显示器环境. 上述针对无边框窗口的特性均可以独立实现,本文将

创建 JS Object 实例

创建 Object 实例的方式有两种.第一种是使用 new 操作符后跟 Object 构造函数,如下所示: var person = new Object(); person.name = "Jack"; person.age = 27; 第二种方式如下所示: var person = { name: "Jack", age: 27 } 使用第二种方式时,如果花括号内为空,则表示定义只包含默认属性和方法的对象.如下所示: var person = {}; perso

Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录

第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年份,请参考本章附录. 附录 历届世界杯冠军 届数 举办年份 举办地点 冠军 第一届 1930年 乌拉圭 乌拉圭 第二届 1934年 意大利 意大利 第三届 1938年 法国 意大利 第四届 1950年 巴西 乌拉圭 第五届 1954年 瑞士 西德 第六届 1958年 瑞典 巴西 第七届 1962年

Flex 4.6 在mxml中创建复杂Object

用mxml创建复杂Object如下 <fx:Object id="alex" name="Alex" catlog="dog">     <fx:size>         <fx:Object length="55cm" height="45cm">             <fx:detail>                 <fx:Object 

通过virt-manager 利用NFS创建、迁移虚拟机2

前面一篇文章介绍了利用NFS创建虚拟机的过程,本文就介绍下如何利用NFS对虚拟机进行动态迁移. 动态迁移就是把一台虚拟机在不停止其运行的情况下迁移到另一台物理机上.这看起来似乎不太可能,不过还好kvm本身就支持者一特性,且libvirt也提供了相应的API,我们可以通过virsh命令或者virt-manager对虚拟机进行动态迁移. 进行动态迁移由于不间断虚拟机的运行,所以其所需的条件就必要多: 1.两台虚拟机的虚拟化环境必须一致,libvirt版本.qemu版本. 2.两台物理机必须有着相同的