通过反射获取类的完整结构【Java】

写在前面的话:

  1. 参考资料:尚硅谷视频
  2. 本章内容:如何通过反射获取类的构造器等
  3. IDE:eclipse
  4. JDK:Java8

目录

1. 通过反射获取类的属性与方法

 2. 获取构造器

2.1 getConstructors()和getDeclaredConstructors()

2.2 获取权限修饰符、构造器名、参数列表

 3.获取父类的构造器

​ 4.获取带泛型的父类

 5.获取父类的泛型 

 6.获取运行时类实现的接口

 7.获取所在的包

 8.获取运行时类的注解


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);
		}
		
	}
}

效果截图:

 完

posted @ 2022-04-17 17:51  辰梦starDream  阅读(3)  评论(0编辑  收藏  举报  来源