同步操作将从 huifer/Code-Analysis 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
本章笔者将围绕 org.springframework.core.type.ClassMetadata
接口和各位读者一起探讨它做了什么。
首先我们来看 ClassMetadata
接口中定义了那些方法
public interface ClassMetadata {
/**
* 类名
*/
String getClassName();
/**
* 是否是接口
*/
boolean isInterface();
/**
* 是否是注解
*/
boolean isAnnotation();
/**
* 是否是超类
*/
boolean isAbstract();
/**
* 是否允许创建,实例化
*/
default boolean isConcrete() {
return !(isInterface() || isAbstract());
}
/**
* 是否有final修饰
*/
boolean isFinal();
/**
* 是否独立
* 1. 不是内部类
* 2. 不是继承类
*/
boolean isIndependent();
default boolean hasEnclosingClass() {
return (getEnclosingClassName() != null);
}
@Nullable
String getEnclosingClassName();
/**
* 是否有父类
*/
default boolean hasSuperClass() {
return (getSuperClassName() != null);
}
/**
* 父类名称
*/
@Nullable
String getSuperClassName();
/**
* 实现接口列表
*/
String[] getInterfaceNames();
/**
* 成员列表
*/
String[] getMemberClassNames();
}
方法名称 | 方法返回值 | 说明 |
---|---|---|
getClassName |
String |
获取类名称 |
isInterface |
boolean |
判断是否是接口 |
isAnnotation |
boolean |
判断是否是注解 |
isAbstract |
boolean |
判断是否 abstract 修饰 |
isConcrete |
boolean |
是否允许实例化 |
isFinal |
boolean |
是否是 final 修饰 |
isIndependent |
boolean |
是否是一个独立类 |
hasEnclosingClass |
boolean |
是否存在封闭类类名 |
getEnclosingClassName |
String |
获取封闭类类名 |
hasSuperClass |
boolean |
是否存在父类 |
getSuperClassName |
String |
获取父类名称 |
getInterfaceNames |
String[] |
获取实现的接口名称 |
getMemberClassNames |
String[] |
获取内部类名称 |
在这个这段代码中笔者对 getEnclosingClassName
做一个简单的例子
public class ClassMetaTest {
@Test
void testEnclosingClassName() {
Class<A> aClass = A.class;
Class<?> enclosingClass = aClass.getEnclosingClass();
System.out.println(enclosingClass);
Class<B> bClass = B.class;
Class<?> enclosingClass1 = bClass.getEnclosingClass();
System.out.println(enclosingClass1);
}
public static class B {
}
public class A {
}
}
class com.source.hot.ioc.book.ioc.ClassMetaTest
class com.source.hot.ioc.book.ioc.ClassMetaTest
如果我们将一个类完全脱离放在包下面单独使用,然后我们再看输出结果是什么。
package com.source.hot.ioc.book.ioc;
public class CTest {
}
测试方法
@Test
void testCtest(){
System.out.println(CTest.class.getEnclosingClass());
}
null
现在我们可以这样理解 getEnclosingClass
的内容了,如果当前类是一个内部类那么这个方法的执行结果将是当前类包裹住的类。
下面我们来看 Spring 中对其的实现,来看类图
StandardClassMetadata
分析下面我们来看 Spring 中的处理类 StandardClassMetadata
,在这个处理类中使用的是 JDK Class
对象的内容,基本操作都是由 Class
提供,这个类对我们学习反射比较有帮助。
首先来看构造方法
@Deprecated
public StandardClassMetadata(Class<?> introspectedClass) {
Assert.notNull(introspectedClass, "Class must not be null");
this.introspectedClass = introspectedClass;
}
这个构造方法传递了一个 Class
对象,这个参数在整个方法实现中承担了所有的功能提供者,比如 getClassName
的实现、
StandardClassMetadata#getClassName
方法详情@Override
public String getClassName() {
return this.introspectedClass.getName();
}
在 StandardClassMetadata
的实现过程中大量的采用了 Class
所提供的方法各位可以查看下面代码来对整个 StandardClassMetadata
类有所了解
public class StandardClassMetadata implements ClassMetadata {
/**
* 被解析的类对象
*/
private final Class<?> introspectedClass;
/**
* Create a new StandardClassMetadata wrapper for the given Class.
* 构造函数
* @param introspectedClass the Class to introspect
* @deprecated since 5.2 in favor of {@link StandardAnnotationMetadata}
*/
@Deprecated
public StandardClassMetadata(Class<?> introspectedClass) {
Assert.notNull(introspectedClass, "Class must not be null");
this.introspectedClass = introspectedClass;
}
/**
* Return the underlying Class.
*/
public final Class<?> getIntrospectedClass() {
return this.introspectedClass;
}
@Override
public String getClassName() {
return this.introspectedClass.getName();
}
@Override
public boolean isInterface() {
return this.introspectedClass.isInterface();
}
@Override
public boolean isAnnotation() {
return this.introspectedClass.isAnnotation();
}
@Override
public boolean isAbstract() {
return Modifier.isAbstract(this.introspectedClass.getModifiers());
}
@Override
public boolean isFinal() {
return Modifier.isFinal(this.introspectedClass.getModifiers());
}
@Override
public boolean isIndependent() {
// 是否存在内部类
// 是否有 class
// 是否有 static 修饰
return (!hasEnclosingClass() ||
(this.introspectedClass.getDeclaringClass() != null &&
Modifier.isStatic(this.introspectedClass.getModifiers())));
}
@Override
@Nullable
public String getEnclosingClassName() {
// 内部类名称
Class<?> enclosingClass = this.introspectedClass.getEnclosingClass();
return (enclosingClass != null ? enclosingClass.getName() : null);
}
@Override
@Nullable
public String getSuperClassName() {
Class<?> superClass = this.introspectedClass.getSuperclass();
return (superClass != null ? superClass.getName() : null);
}
@Override
public String[] getInterfaceNames() {
Class<?>[] ifcs = this.introspectedClass.getInterfaces();
String[] ifcNames = new String[ifcs.length];
for (int i = 0; i < ifcs.length; i++) {
ifcNames[i] = ifcs[i].getName();
}
return ifcNames;
}
@Override
public String[] getMemberClassNames() {
LinkedHashSet<String> memberClassNames = new LinkedHashSet<>(4);
for (Class<?> nestedClass : this.introspectedClass.getDeclaredClasses()) {
memberClassNames.add(nestedClass.getName());
}
return StringUtils.toStringArray(memberClassNames);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。