一、简单介绍
Attribute接口是一个空接口;
AttributeImpl也继承Attribute接口;
根据源码是:记录对象的属性,但是不包含静态属性
对于一些属性是Attribute是接口,然后AttributeImpl去实现接口。
例如:OffsetAttribute 和 OffsetAttributeImpl
二、简单源码分析
public abstract class AttributeImpl implements Cloneable, Attribute { /* * 抽象有两个方法一个clean方法一个copyTo方法 但是copy方法返回是一个void?说明修改后直接改变的还是对象内容。 */ public abstract void clear(); public abstract void copyTo(AttributeImpl target); /* * 这个方法好奇怪,下面的方法调用居然根据这个变量来处理 */ public final String reflectAsString(final boolean prependAttClass) { /* * *StringBuild 没线程安全 效率更高 *StringBuffer 线程安全 * */ final StringBuilder buffer = new StringBuilder(); /* * AttributeReflector是一个接口里面只有一个方法。 * * AttributeReflector(接口,字段属性《剔除静态的》,值); */ reflectWith(new AttributeReflector() { @Override public void reflect(Class<? extends Attribute> attClass, String key, Object value) { if (buffer.length() > 0) { buffer.append(','); } /* * 如果是false的话类名不用添加了 */ if (prependAttClass) { buffer.append(attClass.getName()).append('#'); } /* * buffer添加字符串key=对于value为空null否则就添加value */ buffer.append(key).append('=') .append((value == null) ? "null" : value); } }); return buffer.toString(); } public void reflectWith(AttributeReflector reflector) { // 得到Class也就是反射了 final Class<? extends AttributeImpl> clazz = this.getClass(); // 通过AttributeSource得到 从字面意思是得到所有的接口 final LinkedList<WeakReference<Class<? extends Attribute>>> interfaces = AttributeSource .getAttributeInterfaces(clazz); // 如果没接口抛出异常 if (interfaces.size() != 1) { throw new UnsupportedOperationException( clazz.getName() + " implements more than one Attribute interface, the default reflectWith() implementation cannot handle this."); } // 下面应该是得到第一个接口?但是是为什么那?只得到第一个哪? final Class<? extends Attribute> interf = interfaces.getFirst().get(); final Field[] fields = clazz.getDeclaredFields(); try { for (int i = 0; i < fields.length; i++) { final Field f = fields[i]; // 得到所有的属性,但是静态属性就去掉了 if (Modifier.isStatic(f.getModifiers())) continue; f.setAccessible(true); reflector.reflect(interf, f.getName(), f.get(this)); } } catch (IllegalAccessException e) { // this should never happen, because we're just accessing fields // from 'this' throw new RuntimeException(e); } } /* * 返回一个克隆的对象 */ @Override public AttributeImpl clone() { AttributeImpl clone = null; try { clone = (AttributeImpl) super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); // shouldn't happen } return clone; } }