Java源码示例:com.esotericsoftware.reflectasm.FieldAccess
示例1
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
byte[] jsonBytes = rs.getBytes(columnInfo.aliasName);
if (jsonBytes != null && jsonBytes.length > 0) {
Class<?> valueType = columnInfo.getColumnType(1);
List<?> value = JsonEntityParser.parseArray(jsonBytes, valueType);
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) fieldAccess.get(instance, columnInfo.fieldName);
if (list != null) {
list.addAll(value);
} else {
fieldAccess.set(instance, columnInfo.fieldName, value);
}
}
}
示例2
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
byte[] byteJson = rs.getBytes(columnInfo.aliasName);
if (byteJson == null) {
return;
}
Object obj = JsonEntityParser.parseJson(byteJson, columnInfo.getColumnType(0));
fieldAccess.set(instance, columnInfo.fieldName, obj);
JsonEntity jsonEntity = (JsonEntity) fieldAccess.get(instance, columnInfo.fieldName);
if (jsonEntity != null) {
jsonEntity.afterRead(obj);
}
}
示例3
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
String value = null;
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
String columnName = rs.getMetaData().getColumnName(i);
if (columnName.equals(columnInfo.aliasName)) {
String columnTypeName = rs.getMetaData().getColumnTypeName(i);
// BLOB/TEXT二进制存储结构都存在中文编码问题
// BLOB/TEXT等二进制存储结构不能以UTF-8进行编码,需要将字节数组取出后进行UTF-8的编码转换
if (columnTypeName.equals("BLOB") || columnTypeName.equals("TEXT")) {
byte[] bytes = rs.getBytes(columnInfo.aliasName);
value = new String(bytes, Charset.forName("UTF-8"));
} else {
value = rs.getString(columnInfo.aliasName);
}
break;
}
}
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
fieldAccess.set(instance, columnInfo.fieldName, value);
}
示例4
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
byte[] bytes = rs.getBytes(columnInfo.aliasName);
if (bytes != null && bytes.length > 0) {
Class<?> valueType = columnInfo.getColumnType(1);
List<?> value = JsonEntityParser.parseArray(bytes, valueType);
@SuppressWarnings("unchecked")
Set<Object> set = (Set<Object>) fieldAccess.get(instance, columnInfo.fieldName);
if (set != null) {
set.addAll(value);
} else {
set = new CopyOnWriteArraySet<Object>();
set.addAll(value);
fieldAccess.set(instance, columnInfo.fieldName, value);
}
}
}
示例5
/**
* 获取所有字段的值,,续承类可以重写自定义读取方式
* @return
*/
public Object[] writeData() {
TableInfo tableInfo = getTableInfo(getClass());
FieldAccess fieldAccess = tableInfo.fieldAccess;
ArrayList<Object> writeList = new ArrayList<>();
for (TableColumnInfo columnInfo : tableInfo.columnInfoList) {
Class<?> columnType = columnInfo.getColumnType(0);
AbstractColumnParser parser = ColumnContext.getParser(columnType);
if (parser == null) {
LOGGER.error("Read data error.column type {} not implemented.", columnInfo);
continue;
}
writeBefore();
Object fieldValue = null;
try {
fieldValue = fieldAccess.get(this, columnInfo.fieldName);
parser.writeColumn(writeList, columnInfo, fieldValue);
} catch (Exception ex) {
LOGGER.error("write game error! className={} fieldName={} value={}", tableInfo.clazz().getName(), columnInfo.fieldName, fieldValue);
LOGGER.error("{}", ex);
}
}
return writeList.toArray();
}
示例6
public static TableInfo valueOf(Class<? extends Table> clazz, TableName tableName) {
TableInfo tableInfo = new TableInfo();
tableInfo.clazz = clazz;
tableInfo.tableName = tableName;
tableInfo.classAccess = ConstructorAccess.get(clazz);
tableInfo.fieldAccess = FieldAccess.get(clazz);
//reflect column
tableInfo.reflectColumn(clazz.getDeclaredFields());
if (StringUtils.isBlank(tableInfo.pkName)) {
LOGGER.error(tableName.tableName() + "实体缺少主键");
}
return tableInfo;
}
示例7
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
Object obj = rs.getObject(columnInfo.aliasName);
if (obj != null) {
fieldAccess.set(instance, columnInfo.fieldName, obj);
}
// 数据库中该字段为null时,使用对象中该字段的默认值
}
示例8
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
try {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
Object x = rs.getObject(columnInfo.aliasName);
if (x != null) {
fieldAccess.set(instance, columnInfo.fieldName, x);
}
// 数据库中该字段为null时,使用对象中该字段的默认值
} catch (Exception e) {
e.printStackTrace();
}
}
示例9
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
AtomicLong atomLong = (AtomicLong) fieldAccess.get(instance, columnInfo.fieldName);
atomLong.set(rs.getLong(columnInfo.aliasName));
}
示例10
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
Object x = rs.getObject(columnInfo.aliasName);
if (x != null) {
fieldAccess.set(instance, columnInfo.fieldName, x);
}
// 数据库中该字段为null时,使用对象中该字段的默认值
}
示例11
@Override
public void setClass(Class<?> clazz) {
super.setClass(clazz);
// Setup ReflectASM stuff
try {
access = FieldAccess.get(clazz);
index = access.getIndex(name);
} catch(Exception ex) {
MyTown.instance.LOG.debug(name + " - Falling back to reflection based field caller", ex);
index = -1;
}
}
示例12
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
Date x = rs.getDate(columnInfo.aliasName);
fieldAccess.set(instance, columnInfo.fieldName, x);
}
示例13
@SuppressWarnings("unchecked")
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
Map<Object, Object> originMaps = (Map<Object, Object>) fieldAccess.get(instance, columnInfo.fieldName);
if (originMaps == null) {
originMaps = new ConcurrentHashMap<>();
fieldAccess.set(instance, columnInfo.fieldName, originMaps);
}
Class<?> keyType = columnInfo.columnTypeList.get(1);
Class<?> valueType = columnInfo.columnTypeList.get(2);
byte[] jsonBytes = rs.getBytes(columnInfo.aliasName);
if (jsonBytes != null && jsonBytes.length > 0) {
try {
JSONObject jsonObject = JSON.parseObject(new String(jsonBytes));
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
Object key;
Object obj = entry.getKey();
if (obj instanceof Number) {
Number number = (Number) obj;
if (keyType == Integer.class) {
key = number.intValue();
} else if (keyType == Long.class) {
key = number.longValue();
} else {
LOGGER.error("不支持的map数据类型:{}", keyType);
continue;
}
} else {
key = obj;
}
try {
Object value = JsonEntityParser.parseJson(entry.getValue().toString(), valueType);
originMaps.put(key, value);
} catch (Exception e) {
LOGGER.error("read column error. class={} field={}", instance.getTableInfo().clazz().getSimpleName(), columnInfo.fieldName);
LOGGER.error("", e);
}
}
} catch (Exception ex) {
LOGGER.info("{}", ex);
}
}
}
示例14
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
fieldAccess.set(instance, columnInfo.fieldName, rs.getInt(columnInfo.aliasName) > 0 ? true : false);
}
示例15
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
fieldAccess.set(instance, columnInfo.fieldName, rs.getBytes(columnInfo.aliasName));
}
示例16
/**
* Builds the field sorted cache. Sorts the fields alphabetically by name.
*/
private static void buildFieldCache(Class<?> clazz, FieldAccess fieldAccess) {
if(!_fieldSortCache.contains(clazz)) {
LogCache[] sortedLogCache = new LogCache[fieldAccess.getFieldCount()];
String[] sortedFieldNames = Arrays.copyOf(fieldAccess.getFieldNames(), sortedLogCache.length);
Arrays.sort(sortedFieldNames);
for(int i = 0; i < sortedLogCache.length; i++) {
sortedLogCache[i] = new LogCache(fieldAccess.getIndex(sortedFieldNames[i]),
getLoggingScope(clazz, sortedFieldNames[i]));
}
_fieldSortCache.put(clazz, sortedLogCache);
}
}
示例17
public static LogCache[] getFieldIndexes(Class<?> clazz, FieldAccess fieldAccess) {
buildFieldCache(clazz, fieldAccess);
return _fieldSortCache.get(clazz);
}
示例18
public FieldAccessBenchmark () throws Exception {
int count = 1000000;
Object[] dontCompileMeAway = new Object[count];
FieldAccess access = FieldAccess.get(SomeClass.class);
SomeClass someObject = new SomeClass();
int index = access.getIndex("name");
Field field = SomeClass.class.getField("name");
for (int i = 0; i < 100; i++) {
for (int ii = 0; ii < count; ii++) {
access.set(someObject, index, "first");
dontCompileMeAway[ii] = access.get(someObject, index);
}
for (int ii = 0; ii < count; ii++) {
field.set(someObject, "first");
dontCompileMeAway[ii] = field.get(someObject);
}
}
warmup = false;
for (int i = 0; i < 100; i++) {
start();
for (int ii = 0; ii < count; ii++) {
access.set(someObject, index, "first");
dontCompileMeAway[ii] = access.get(someObject, index);
}
end("FieldAccess");
}
for (int i = 0; i < 100; i++) {
start();
for (int ii = 0; ii < count; ii++) {
field.set(someObject, "first");
dontCompileMeAway[ii] = field.get(someObject);
}
end("Reflection");
}
chart("Field Set/Get");
}