第三课 获取运行时类的多种结构

1 获取属性

1.1 获取属性结构

方法返回值所获取内容
getFields()Field[]获取当前运行时类及其父类中声明为public权限的属性
getDeclaredFields()Field[]获取当前运行时类中声明的所有属性(不包含父类中声明的属性)
/*
 * 获取属性结构
 */
public static void test01() {
	Class clazz = PersonFull.class;
	System.out.println("-------------getFields() START--------------");
	Field[] fields = clazz.getFields();
	for (Field tmp : fields) {
		System.out.println(tmp);
	}

	// 运行结果:
	// public int Reflection.GetClass.PersonFull.id
	// public double Reflection.GetClass.Creature.wight
	System.out.println("-------------getFields() END--------------");

	System.out.println("-------------getDeclaredFields() START--------------");
	Field[] declaredFields = clazz.getDeclaredFields();
	for (Field tmp : declaredFields) {
		System.out.println(tmp);
	}
	// 运行结果:
	// private java.lang.String Reflection.GetClass.PersonFull.name
	// int Reflection.GetClass.PersonFull.age
	// public int Reflection.GetClass.PersonFull.id
	System.out.println("-------------getDeclaredFields() END--------------");
}

1.2 获取属性相关信息

  • 相关方法
    |方法|返回值|所获取内容|
    |–|--|–|
    |getModifiers()|int|获取属性的修饰符|
    |getType()|Class|获取属性的数据类型|
    |getName()|String|获取属性的变量名|

  • getModifiers()方法的返回值

返回值代表的修饰符
0defaul
1public
2private
4protected
/*
 * 获取修饰符、数据类型、变量名
 */
public static void test02() {
	Class clazz = PersonFull.class;
	Field[] declaredFields = clazz.getDeclaredFields();
	// 获取修饰符
	System.out.println("-------------getModifiers() START--------------");
	for (Field tmp : declaredFields) {
		int modifiers = tmp.getModifiers();
		System.out.println(Modifier.toString(modifiers) + modifiers);
	}
	System.out.println("-------------getModifiers() END--------------");

	System.out.println("-------------getType() START--------------");
	for (Field tmp : declaredFields) {
		String name = tmp.getType().getName();
		System.out.println(name);
	}
	System.out.println("-------------getType() END--------------");
	
	System.out.println("-------------getName() START--------------");
	for (Field tmp : declaredFields) {
		String name = tmp.getName();
		System.out.println(name);
	}
	System.out.println("-------------getName() END--------------");
}

2 获取方法

2.1 获取方法结构

方法返回值所获取内容
getMethods()Method[]获取当前运行时类及其所有父类中声明为public权限的方法
getDeclaredMethods()Method[]获取当前运行时类中声明的所有方法(不包含父类中声明的方法)
/*
	 * 获取运行时类的方法结构
	 */
	public static void test01() {
		Class clazz = PersonFull.class;
		Method[] methods = clazz.getMethods();
		Method[] declaredMethods = clazz.getDeclaredMethods();
		for (Method tmp : methods) {
			System.out.println(tmp);
		}
		// 运行结果
		// public int Reflection.GetClass.PersonFull.compareTo(java.lang.String)
		// public int Reflection.GetClass.PersonFull.compareTo(java.lang.Object)
		// public java.lang.String
		// Reflection.GetClass.PersonFull.display(java.lang.String)
		// public void Reflection.GetClass.PersonFull.info()
		// public void Reflection.GetClass.Creature.eat()
		// public final void java.lang.Object.wait() throws
		// java.lang.InterruptedException
		// public final void java.lang.Object.wait(long,int) throws
		// java.lang.InterruptedException
		// public final native void java.lang.Object.wait(long) throws
		// java.lang.InterruptedException
		// public boolean java.lang.Object.equals(java.lang.Object)
		// public java.lang.String java.lang.Object.toString()
		// public native int java.lang.Object.hashCode()
		// public final native java.lang.Class java.lang.Object.getClass()
		// public final native void java.lang.Object.notify()
		// public final native void java.lang.Object.notifyAll()
		System.out.println("------------------");
		for (Method tmp : declaredMethods) {
			System.out.println(tmp);
		}
		// 运行结果
		// public int Reflection.GetClass.PersonFull.compareTo(java.lang.String)
		// public int Reflection.GetClass.PersonFull.compareTo(java.lang.Object)
		// public java.lang.String
		// Reflection.GetClass.PersonFull.display(java.lang.String)
		// private java.lang.String
		// Reflection.GetClass.PersonFull.show(java.lang.String)
		// public void Reflection.GetClass.PersonFull.info()

	}

2.2 获取方法相关信息

方法返回值所获取内容
getModifiers()int获取权限修饰符
getReturnType()Class获取返回值类型
getName()String获取方法名
getParameters()Parameter[]获取形参类型和形参名
getExceptionTypes()Class[]获取异常
getAnnotations()Annotation[]获取方法声明的注解
/*
 * 获取权限修饰符、返回值类型、方法名(参数类型 形参名)、异常、注解
 */
public static void test02() {
	Class clazz = PersonFull.class;
	Method[] declaredMethods = clazz.getDeclaredMethods();

	// 获取权限修饰符
	System.out.println("------------获取权限修饰符--------------");
	for (Method tmp : declaredMethods) {
		int modifiers = tmp.getModifiers();
		System.out.println(Modifier.toString(modifiers));
	}

	// 获取返回值类型
	System.out.println("------------获取返回值类型--------------");
	for (Method tmp : declaredMethods) {
		Class returnType = tmp.getReturnType();
		System.out.println(returnType.getName());
	}

	// 获取方法名
	System.out.println("------------获取方法名--------------");
	for (Method tmp : declaredMethods) {
		String name = tmp.getName();
		System.out.println(name);
	}

	// 获取形参类型和形参名
	System.out.println("------------获取形参类型和形参名--------------");
	for (Method tmp : declaredMethods) {
		Parameter[] parameters = tmp.getParameters();
		for (Parameter tmp_1 : parameters) {
			System.out.println(tmp.getName() + " " + tmp_1);
		}
	}

	// 获取异常
	System.out.println("------------获取异常--------------");
	for (Method tmp : declaredMethods) {
		Class[] exceptionTypes = tmp.getExceptionTypes();
		for (Class tmp_1 : exceptionTypes) {
			System.out.println(tmp.getName() + " " + tmp_1.getName());
		}
	}
	// 获取方法声明的注解
	System.out.println("------------获取方法声明的注解--------------");
	for (Method tmp : declaredMethods) {
		Annotation[] annotations = tmp.getAnnotations();
		for (Annotation tmp_1 : annotations) {
			System.out.println(tmp_1);
		}
	}
}

3 其他信息的获取

3.1 获取构造器结构

方法返回值所获取内容
getConstructors()Constructor[]获取当前运行时类中声明为public权限的构造器
getDeclaredConstructors()Constructor[]获取当前运行时类中声明的所有所有构造器
public static void test01() {
	Class clazz = PersonFull.class;
	Constructor[] constructors = clazz.getConstructors();
	Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
	for (Constructor tmp : constructors) {
		System.out.println(tmp);
	}
	// 运行结果
	// public Reflection.GetClass.PersonFull(java.lang.String,int)
	// public Reflection.GetClass.PersonFull(java.lang.String)
	// public Reflection.GetClass.PersonFull()
	System.out.println("----------------------");
	for (Constructor tmp : declaredConstructors) {
		System.out.println(tmp);
	}
	// 运行结果
	//public Reflection.GetClass.PersonFull(java.lang.String,int)
	//public Reflection.GetClass.PersonFull(java.lang.String)
	//public Reflection.GetClass.PersonFull()
}

3.2 获取父类结构

方法返回值所获取内容
getSuperclass()Class获取当前运行时类的父类
getGenericSuperclass()Type获取当前运行时类带有泛型的父类
getActualTypeArguments()Type[](可能存在Map<k,v>的情况)获取当前运行时类带有泛型的父类的泛型类型
/*
 * 获取父类结构
 */
public static void test02() {
	Class clazz = PersonFull.class;
	// 获取继承的父类
	Class superclass = clazz.getSuperclass();
	System.out.println(superclass.getName());
	System.out.println("------------------------------");
	// 获取带有泛型的父类
	Type genericSuperclass = clazz.getGenericSuperclass();
	System.out.println(genericSuperclass);
	System.out.println("------------------------------");
	// 获取带有泛型的父类的泛型类型
	ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; // 强转成ParameterizedType类型
	Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // 获取泛型类型
	System.out.println(actualTypeArguments[0].getTypeName());
	// 运行结果
	//Reflection.GetClass.Creature
	//------------------------------
	//Reflection.GetClass.Creature<java.lang.String>
	//------------------------------
	//java.lang.String
}

3.3 获取其他结构

方法返回值所获取内容
getInterfaces()Class[]获取接口
getPackage()Package获取运行时类所在的包
getAnnotations()Annotation[]获取运行时类声明的注解
public static void test03() {
	Class clazz = PersonFull.class;
	// 获取接口
	Class[] interfaces = clazz.getInterfaces();
	for (Class tmp:interfaces) {
		System.out.println(tmp);
	}
	System.out.println("-------------------");
	// 获取运行时类所在的包
	Package package1 = clazz.getPackage();
	System.out.println(package1);
	System.out.println("-------------------");
	// 获取运行时类声明的注解
	Annotation[] annotations = clazz.getAnnotations();
	for (Annotation tmp:annotations) {
		System.out.println(tmp);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值