Java通过反射调用类的完整结构

Java通过反射调用类的完整结构


Field、Method、Constructor、Superclass、Interface、Annotation

使用反射可以取得:

  1. 实现的全部接口
    public Class<?>[] getInterfaces()
    确定此对象所表示的类或接口实现的接口。

  2. 所继承的父类
    public Class<? Super T> getSuperclass()
    返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的 Class。

  3. 全部的构造器
    public Constructor[] getConstructors()
    返回此 Class 对象所表示的类的所有public构造方法。
    public Constructor[] getDeclaredConstructors()
    返回此 Class 对象表示的类声明的所有构造方法。

    • Constructor类中:
      取得修饰符: public int getModifiers();
      取得方法名称: public String getName();
      取得参数的类型:public Class<?>[] getParameterTypes();
  4. 全部的方法
    public Method[] getDeclaredMethods()
    返回此Class对象所表示的类或接口的全部方法
    public Method[] getMethods()
    返回此Class对象所表示的类或接口的public的方法

    • Method类中:
      public Class<?> getReturnType()取得全部的返回值
      public Class<?>[] getParameterTypes()取得全部的参数
      public int getModifiers()取得修饰符
      public Class<?>[] getExceptionTypes()取得异常信息
  5. 全部的Field
    public Field[] getFields()
    返回此Class对象所表示的类或接口的public的Field。
    public Field[] getDeclaredFields()
    返回此Class对象所表示的类或接口的全部Field。

    • Field方法中:
      public int getModifiers() 以整数形式返回此Field的修饰符
      public Class<?> getType() 得到Field的属性类型
      public String getName() 返回Field的名称。
  6. Annotation相关
    get Annotation(Class annotationClass)
    getDeclaredAnnotations()

  7. 泛型相关
    获取父类泛型类型:Type getGenericSuperclass()
    泛型类型:ParameterizedType
    获取实际的泛型类型参数数组:getActualTypeArguments()

  8. 类所在的包 Package getPackage()

public class TestField {
	//获取对应的运行时类的属性
	@Test
	public void test1() {
		Class clazz = Person.class;
		//1. getFields():只能获取运行类中极其父类中,声明为public的
		Field[] fields = clazz.getFields();
		for (int i = 0; i < fields.length; i++) {
			System.out.println(fields[i]);
		}
		//2.getDeclaredFields():获取运行时类声明的所有方法
		Field[] fields1 = clazz.getDeclaredFields();
		for(Field f : fields1) {
			System.out.println(f.getName());
		}
	}
	//权限修饰符 变量类型 变量名
	//获取属性的各个部分的内容
	@Test
	public void test2() {
		Class clazz = Person.class;
		Field[] fields1 = clazz.getDeclaredFields();
		for(Field f : fields1) {
			//1.获取每个属性的权限修饰符
			int i = f.getModifiers();
			String str1 = Modifier.toString(i);
			System.out.println(str1);
			//2.获取每个属性变量类型
			Class type = f.getType();
			System.out.println(type.getName());
			//3.获取属性名
			System.out.println(f.getName());
			
		}
	}
}
public class TestMethod {
	//1.获取运行时类的方法
	@Test
	public void test1() {
		Class clazz = Person.class;
		//1.getMethods(): 获取运行时类及其父类所有的声明为public的方法
		Method[] m1 = clazz.getMethods();
		for(Method m : m1) {
			System.out.println(m);
		}
		//2.getDeclaredMethods():获取运行时类本身声明的所有方法
		Method[] m2  = clazz.getDeclaredMethods();
		for(Method m : m2) {
			System.out.println(m);
		}
	}
	//注解 权限修饰符 返回值类型 方法名 形参列表 异常
	@Test
	public void test2()	{
		Class clazz = Person.class;
		Method[] m2 = clazz.getDeclaredMethods();
		for(Method m : m2) {
			//1.注解
			Annotation[] ann = m.getAnnotations();
			for(Annotation a : ann) {
				System.out.println(a);
			}		
			//2.权限修饰符
			String str = Modifier.toString(m.getModifiers());
			System.out.print(str + " ");
			//3.返回值类型
			Class returnType = m.getReturnType();
			System.out.print(returnType.getName()+" ");
			//4.方法名
			System.out.print(m.getName()+ "");
			//5.形参列表
			System.out.print("(");
			Class [] params = m.getParameterTypes();
			for (int i = 0; i < params.length; i++) {
				System.out.print(params[i].getName()+" args-"+ i+ " ");
			}
			System.out.print(")");
			//6.异常类型
			Class[] exps = m.getExceptionTypes();
			for (int i = 0; i < exps.length; i++) {
				System.out.print(exps[i].getName()+" exps-"+ i+ " ");
			}
			System.out.println();
		}
	}
}
	@Test
	public void test2() throws Exception {
		String className = "testReflection.Person";
		Class clazz = Class.forName(className);
		
		Constructor[] cons = clazz.getDeclaredConstructors();
		for(Constructor c : cons) {
			System.out.println(c);
		}
	}
public class TestOthers {
	//6.获取注解
	public void test6() {
		Class clazz = Person.class;
		Annotation [] anns = clazz.getAnnotations();
		for(Annotation ann : anns) {
			System.out.println(ann);
		}
	}
	//5.获取所在的包
	@Test
	public void test5() {
		Class clazz = Person.class;
		Package pack = clazz.getPackage();
		System.out.println(pack);//package testReflection
	}
	
	//4.获取实现的接口
	@Test
	public void test4() {
		Class clazz = Person.class;
		Class[] interfaces = clazz.getInterfaces();
		for(Class i : interfaces) {
			System.out.println(i);
			/*
			 * interface java.lang.Comparable
			   interface testReflection.MyInterface
			 */
		}
	}
	//3.获取父类符泛型
	@Test
	public void test3() {
		Class clazz = Person.class;
		Type type1 = clazz.getGenericSuperclass();
		ParameterizedType param = (ParameterizedType)type1;
		Type[] ars = param.getActualTypeArguments();
		System.out.println(((Class)ars[0]).getTypeName());//java.lang.String
	}
	
	//2获取带泛型的父类
	@Test
	public void test2() {
		Class clazz = Person.class;
		Type type1 = clazz.getGenericSuperclass();
		System.out.println(type1);//testReflection.Creature<java.lang.String>

		
	}
	//1.获取运行时类的父类
	@Test
	public void test() {
		Class clazz = Person.class;
		Class superClass =  clazz.getSuperclass();
		System.out.println(superClass);//class testReflection.Creature
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值