This commit is contained in:
wentch
2015-12-21 10:17:28 +08:00
parent db912ddf38
commit 52a327ea41
3 changed files with 57 additions and 76 deletions

View File

@@ -0,0 +1,49 @@
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package java.lang.annotation;
/**
* The annotation type {@code java.lang.annotation.Repeatable} is
* used to indicate that the annotation type whose declaration it
* (meta-)annotates is <em>repeatable</em>. The value of
* {@code @Repeatable} indicates the <em>containing annotation
* type</em> for the repeatable annotation type.
*
* @since 1.8
* @jls 9.6 Annotation Types
* @jls 9.7 Annotations
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
/**
* Indicates the <em>containing annotation type</em> for the
* repeatable annotation type.
* @return the containing annotation type
*/
Class<? extends Annotation> value();
}

View File

@@ -38,13 +38,13 @@ public abstract class Factory<R extends Reader, W extends Writer> {
private final Encodeable<W, ?> anyEncoder = new AnyEncoder(this); private final Encodeable<W, ?> anyEncoder = new AnyEncoder(this);
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
private final HashedMap<Class, Creator> creators = new HashedMap(); private final ConcurrentHashMap<Class, Creator> creators = new ConcurrentHashMap();
private final Map<String, Class> entitys = new ConcurrentHashMap(); private final Map<String, Class> entitys = new ConcurrentHashMap();
private final HashedMap<Type, Decodeable<R, ?>> decoders = new HashedMap(); private final ConcurrentHashMap<Type, Decodeable<R, ?>> decoders = new ConcurrentHashMap();
private final HashedMap<Type, Encodeable<W, ?>> encoders = new HashedMap(); private final ConcurrentHashMap<Type, Encodeable<W, ?>> encoders = new ConcurrentHashMap();
private final HashMap<AccessibleObject, ConvertColumnEntry> columnEntrys = new HashMap(); private final HashMap<AccessibleObject, ConvertColumnEntry> columnEntrys = new HashMap();
@@ -130,7 +130,11 @@ public abstract class Factory<R extends Reader, W extends Writer> {
ConvertColumnEntry en = this.columnEntrys.get(field); ConvertColumnEntry en = this.columnEntrys.get(field);
if (en != null) return en; if (en != null) return en;
final ConvertType ct = this.getConvertType(); final ConvertType ct = this.getConvertType();
for (ConvertColumn ref : field.getAnnotationsByType(ConvertColumn.class)) { final ConvertColumns ccs = field.getAnnotation(ConvertColumns.class);
final ConvertColumn cc = field.getAnnotation(ConvertColumn.class);
if (ccs == null && cc == null) return null;
final ConvertColumn[] cca = (ccs == null) ? new ConvertColumn[]{cc} : ccs.value();
for (ConvertColumn ref : cca) {
if (ref.type().contains(ct)) { if (ref.type().contains(ct)) {
ConvertColumnEntry entry = new ConvertColumnEntry(ref); ConvertColumnEntry entry = new ConvertColumnEntry(ref);
if (skipAllIgnore) { if (skipAllIgnore) {

View File

@@ -1,72 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert;
import java.lang.reflect.*;
/**
* 只增不减的伪Map类
*
* @see http://www.redkale.org
* @author zhangjx
* @param <K>
* @param <V>
*/
@SuppressWarnings("unchecked")
public final class HashedMap<K extends Type, V> {
protected final transient Entry<K, V>[] table;
public HashedMap() {
this(128);
}
public HashedMap(int initCapacity) {
this.table = new Entry[Math.max(initCapacity, 16)];
}
public final V get(final K key) {
final K k = key;
final Entry<K, V>[] data = this.table;
Entry<K, V> entry = data[k.hashCode() & (data.length - 1)];
while (entry != null) {
if (k == entry.key) return entry.value;
entry = entry.next;
}
return null;
}
public final V put(K key, V value) {
final K k = key;
final Entry<K, V>[] data = this.table;
final int index = k.hashCode() & (data.length - 1);
Entry<K, V> entry = data[index];
while (entry != null) {
if (k == entry.key) {
V old = entry.value;
entry.value = value;
return old;
}
entry = entry.next;
}
data[index] = new Entry(key, value, data[index]);
return null;
}
protected static final class Entry<K, V> {
protected V value;
protected final K key;
protected final Entry<K, V> next;
protected Entry(K key, V value, Entry<K, V> next) {
this.key = key;
this.value = value;
this.next = next;
}
}
}