详细设计
本片介绍元数据定义和实现、被标注的元数据类型定义,如下图圈出的部分
元数据定义和实现
被标注的元数据类型定义 - AnnotatedTypeMetadata
被标注的元数据类型定义,定义了获取注解方法等
代码实现
package cn.zhanghongyang.core.type;
import cn.zhanghongyang.core.annotation.MergedAnnotations;
/**
* @Author: zhanghongyang
* @Description: 可被标注的元数据定义
* 从定义的方法和子类可以看出,这个接口子类的元数据上一定可以使用注解
* 子类:AnnotationMetadata, MethodMetadata
*/
public interface AnnotatedTypeMetadata {
/**
* 获取所有注解
* @return
*/
MergedAnnotations getAnnotations();
}
类元数据 - ClassMetadata
类元数据定义,保存类元数据的信息
代码实现
package cn.zhanghongyang.core.type;
/**
* @Author: zhanghongyang
* @Description: 类元数据定义
*/
public interface ClassMetadata {
/**
* 类名
* @return
*/
String getClassName();
/**
* 超类名称
* @return
*/
String getSuperClassName();
/**
* 获取接口名称
* @return
*/
String[] getInterfaceNames();
}
注解元数据 - AnnotationMetadata
因为注解是继承了Annotation的接口,有类的属性,所以继承了ClassMetadata,又因为注解上面可以标注注解所以也继承AnnotatedTypeMetadata
package cn.zhanghongyang.core.type;
/**
* @Author: zhanghongyang
* @Description: 注解元数据定义
*/
public interface AnnotationMetadata extends ClassMetadata, AnnotatedTypeMetadata{
}
方法元数据 - MethodMetadata
因为方法上可以标注注解所以继承自AnnotatedTypeMetadata
package cn.zhanghongyang.core.type;
/**
* @Author: zhanghongyang
* @Description: 方法元数据定义
*/
public interface MethodMetadata extends AnnotatedTypeMetadata{
/**
* 获取方法名称
* @return
*/
String getMethodName();
/**
* 方法所在的类名称
* @return
*/
String getDeclaringClassName();
/**
* 获取返回类型
* @return
*/
String getReturnTypeName();
/**
* 抽象方法
* @return
*/
boolean isAbstract();
/**
* 静态方法
* @return
*/
boolean isStatic();
/**
* final方法
* @return
*/
boolean isFinal();
/**
* 是否可以重写
* @return
*/
boolean isOverridable();
}
注解类元数据的实现 - SimpleAnnotationMetadata
代码实现
package cn.zhanghongyang.core.type.classreader;
import cn.zhanghongyang.core.annotation.MergedAnnotations;
import cn.zhanghongyang.core.type.AnnotationMetadata;
import cn.zhanghongyang.core.type.MethodMetadata;
import java.util.Set;
/**
* @Author: zhanghongyang
* @Description: 注解元数据实现
*/
public class SimpleAnnotationMetadata implements AnnotationMetadata {
//类名称
private String className;
//访问修饰
private int access;
//外部类名称
private String enclosingClassName;
//父类名称
private String superClassName;
//是否为独立的每部类
private boolean independentInnerClass;
//接口名称
private String[] interfaceNames;
//成员类名称,即内部类
private String[] memberClassNames;
//方法集合
private MethodMetadata[] annotatedMethods;
//注解和元注解集合类
private MergedAnnotations annotations;
//注解类型集合
private Set<String> annotationTypes;
public SimpleAnnotationMetadata(String className, int access, String enclosingClassName,
String superClassName, boolean independentInnerClass, String[] interfaceNames,
String[] memberClassNames, MethodMetadata[] annotatedMethods, MergedAnnotations annotations) {
this.className = className;
this.access = access;
this.enclosingClassName = enclosingClassName;
this.superClassName = superClassName;
this.independentInnerClass = independentInnerClass;
this.interfaceNames = interfaceNames;
this.memberClassNames = memberClassNames;
this.annotatedMethods = annotatedMethods;
this.annotations = annotations;
}
@Override
public MergedAnnotations getAnnotations() {
return this.annotations;
}
@Override
public String getClassName() {
return this.className;
}
@Override
public String getSuperClassName() {
return this.superClassName;
}
@Override
public String[] getInterfaceNames() {
return this.interfaceNames;
}
}
方法元数据的实现 - SimpleMethodMetadata
代码实现
package cn.zhanghongyang.core.type.classreader;
import cn.zhanghongyang.core.annotation.MergedAnnotations;
import cn.zhanghongyang.core.type.MethodMetadata;
import org.objectweb.asm.Opcodes;
/**
* @Author: zhanghongyang
* @Description: 方法元数据实现
*/
public class SimpleMethodMetadata implements MethodMetadata {
private final String methodName;
private final int access;
private final String declaringClassName;
private final String returnTypeName;
public SimpleMethodMetadata(String methodName, int access, String declaringClassName, String returnTypeName) {
this.methodName = methodName;
this.access = access;
this.declaringClassName = declaringClassName;
this.returnTypeName = returnTypeName;
}
@Override
public String getMethodName() {
return this.methodName;
}
@Override
public String getDeclaringClassName() {
return this.declaringClassName;
}
@Override
public String getReturnTypeName() {
return this.returnTypeName;
}
@Override
public boolean isAbstract() {
return (this.access & Opcodes.ACC_ABSTRACT) != 0;
}
@Override
public boolean isStatic() {
return (this.access & Opcodes.ACC_STATIC) != 0;
}
@Override
public boolean isFinal() {
return (this.access & Opcodes.ACC_FINAL) != 0;
}
@Override
public boolean isOverridable() {
return !isStatic() && !isFinal() && !isPrivate();
}
public boolean isPrivate() {
return (this.access & Opcodes.ACC_PRIVATE) != 0;
}
@Override
public MergedAnnotations getAnnotations() {
return this.getAnnotations();
}
}