通过反射获取类的完整结构【Java】
写在前面的话:
- 参考资料:尚硅谷视频
- 本章内容:如何通过反射获取类的构造器等
- IDE:eclipse
- JDK:Java8
目录
2.1 getConstructors()和getDeclaredConstructors()
1. 通过反射获取类的属性与方法
参考这篇文章:通过反射获取类的属性与方法 星与梦想star_dream的文章
2. 获取构造器
2.1 getConstructors()和getDeclaredConstructors()
import java.lang.reflect.Constructor;
public class TestConstructor {
public static void main(String[] args) {
Class<Person> clazz = Person.class;
Constructor[] constructors = clazz.getConstructors();
for(Constructor c : constructors) {
System.out.println(c);
}
System.out.println();
Constructor[] constructors2 = clazz.getDeclaredConstructors();
for(Constructor c : constructors2) {
System.out.println(c);
}
}
}
效果截图:
2.2 获取权限修饰符、构造器名、参数列表
该节与获取属性、方法一样,所以简要略过,只给出代码
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class TestConstructor {
public static void main(String[] args) {
Class<Person> clazz = Person.class;
Constructor[] constructors = clazz.getDeclaredConstructors();
for(Constructor c : constructors) {
//1.获取构造器的权限修饰符
System.out.print(Modifier.toString(c.getModifiers()) + " ");
//2.获取构造器名
System.out.print(c.getName());
//3.获取构造器参数列表
Class[] param = c.getParameterTypes();
System.out.print("(");
for(int i = 0;i < param.length;i++) {
if(i == param.length - 1) {
System.out.print(param[i].getName() + " args-" + i);
}else {
System.out.print(param[i].getName() + " args-" + i + ",");
}
}
System.out.println(")");
}
}
}
效果截图:
3.获取父类的构造器
System.out.println(clazz.getSuperclass());

4.获取带泛型的父类
代码示例
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
public class TestOther {
public static void main(String[] args) {
Class<Person> clazz = Person.class;
//1.获取父类构造器
System.out.println(clazz.getSuperclass());
System.out.println();
//2.获取带泛型的父类构造器
Type type = clazz.getGenericSuperclass();
System.out.println(type);
}
}
5.获取父类的泛型
//获取父类的泛型
ParameterizedType parameterizedType = (ParameterizedType)type;//强转成Type的子接口
Type[] generic = parameterizedType.getActualTypeArguments();//获取泛型
for(Type t : generic) {
System.out.print(((Class)t).getName() + " ");//获取了泛型,强转成Class类的实例
}
代码示例
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class TestOther {
public static void main(String[] args) {
Class<Person> clazz = Person.class;
//1.获取父类构造器
System.out.println(clazz.getSuperclass());
System.out.println();
//2.获取带泛型的父类构造器
Type type = clazz.getGenericSuperclass();
System.out.println(type);
System.out.println();
//3.获取父类的泛型
ParameterizedType parameterizedType = (ParameterizedType)type;//强转成Type的子接口
Type[] generic = parameterizedType.getActualTypeArguments();//获取泛型
for(Type t : generic) {
System.out.print(((Class)t).getName() + " ");//获取了泛型,强转成Class类的实例
}
}
}
效果演示
6.获取运行时类实现的接口
Class[] interfaces = clazz.getInterfaces();
for(Class c : interfaces) {
System.out.print(c.getName() + " ");
}
System.out.println();
代码示例
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class TestOther {
public static void main(String[] args) {
Class<Person> clazz = Person.class;
//1.获取父类构造器
System.out.println(clazz.getSuperclass());
System.out.println();
//2.获取带泛型的父类构造器
Type type = clazz.getGenericSuperclass();
System.out.println(type);
System.out.println();
//3.获取父类的泛型
ParameterizedType parameterizedType = (ParameterizedType)type;//强转成Type的子接口
Type[] generic = parameterizedType.getActualTypeArguments();//获取泛型
for(Type t : generic) {
System.out.print(((Class)t).getName() + " ");//获取了泛型,强转成Class类的实例
}
System.out.println("\n");
//4.获取实现的接口
Class[] interfaces = clazz.getInterfaces();
for(Class c : interfaces) {
System.out.print(c.getName() + " ");
}
System.out.println();
}
}
效果截图:
7.获取所在的包
Package pack = clazz.getPackage();
System.out.println(pack);
代码示例
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class TestOther {
public static void main(String[] args) {
Class<Person> clazz = Person.class;
//1.获取父类构造器
System.out.println(clazz.getSuperclass());
System.out.println();
//2.获取带泛型的父类构造器
Type type = clazz.getGenericSuperclass();
System.out.println(type);
System.out.println();
//3.获取父类的泛型
ParameterizedType parameterizedType = (ParameterizedType)type;//强转成Type的子接口
Type[] generic = parameterizedType.getActualTypeArguments();//获取泛型
for(Type t : generic) {
System.out.print(((Class)t).getName() + " ");//获取了泛型,强转成Class类的实例
}
System.out.println("\n");
//4.获取实现的接口
Class[] interfaces = clazz.getInterfaces();
for(Class c : interfaces) {
System.out.print(c.getName() + " ");
}
System.out.println("\n");
//5.获取所在的包
Package pack = clazz.getPackage();
System.out.println(pack);
}
}
8.获取运行时类的注解
Annotation[] annotations = clazz.getAnnotations();
for(Annotation a : annotations) {
System.out.println(a);
}
代码示例(本章内容全部代码)
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class TestOther {
public static void main(String[] args) {
Class<Person> clazz = Person.class;
//1.获取父类构造器
System.out.println(clazz.getSuperclass());
System.out.println();
//2.获取带泛型的父类构造器
Type type = clazz.getGenericSuperclass();
System.out.println(type);
System.out.println();
//3.获取父类的泛型
ParameterizedType parameterizedType = (ParameterizedType)type;//强转成Type的子接口
Type[] generic = parameterizedType.getActualTypeArguments();//获取泛型
for(Type t : generic) {
System.out.print(((Class)t).getName() + " ");//获取了泛型,强转成Class类的实例
}
System.out.println("\n");
//4.获取实现的接口
Class[] interfaces = clazz.getInterfaces();
for(Class c : interfaces) {
System.out.print(c.getName() + " ");
}
System.out.println("\n");
//5.获取所在的包
Package pack = clazz.getPackage();
System.out.println(pack);
System.out.println();
//6.获取运行时类的注解
Annotation[] annotations = clazz.getAnnotations();
for(Annotation a : annotations) {
System.out.println(a);
}
}
}
效果截图:
完
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通