Java:反射中构造方法、属性和普通方法(如何获取、获取信息、如何使用)

本文详细介绍了Java反射中如何获取与使用构造方法、属性和普通方法。包括获取构造方法、属性和普通方法的各种方式,获取相关信息如修饰符、类型等,并展示了如何通过反射创建对象、设置和获取属性值以及调用方法。
//辅助类
public class Student{
	String name;
	public Student() {
	}
	public  Student(String name) {
		this.name=name;
	}
	public  static int  doHomework(int a, String name) {
		System.out.println("正在做作业");
		return a;
	}
}

构造方法

1、获取构造方法
  • ①Constructor[] getConstrutors():返回该Class对象表示类包含的所有public构造方法(不含继承)所对应Constructor对象数组。

  • ②Constructor getConstrutor(Class<?>… parameterTypes):返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象。

public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;//获取类
			Constructor constructor=clazz.getConstructor();//获取类中的构造方法
			System.out.println(constructor.getName());
			constructor=clazz.getConstructor(String.class);//获取类中第二种构造方法
			System.out.println(constructor.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • ③Constructor<?>[] getDeclaredConstructors():返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。

  • ④Constructor getDeclaredConstructor(Class<?>… parameterTypes):返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限:如果把Student类中的构造方法访问权限改为非public的权限也不影响)的Constructor对象。

public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;//获取类
			Constructor constructor=clazz.getDeclaredConstructor();//获取类中的构造方法
			System.out.println(constructor.getName());
			constructor=clazz.getDeclaredConstructor(String.class);//获取类中第二种构造方法
			System.out.println(constructor.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
2、获取构造方法信息
  • ①Class getDeclaringClass():返回声明Constructor对象对应构造方法的类的Class对象。
public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			Constructor constructor=clazz.getDeclaredConstructor();
			clazz=constructor.getDeclaringClass();//获取构造方法所属的类信息
			System.out.println(clazz.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • ②int getModifiers():以整数形式返回Constructor对象表示的构造函数的修饰符。
public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			Constructor constructor=clazz.getDeclaredConstructor();
			int a=constructor.getModifiers();//获取访问权限修饰符,并接收返回值
			String result=Modifier.toString(a);//比对返回值并接收返回的访问权限字符串
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • ③String getName() :以字符串形式返回Constructor对象所表示得构造方法的名称。
public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			Constructor constructor=clazz.getDeclaredConstructor();
			System.out.println(constructor.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • ④Class<?>[] getParameterTypes():返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此 。如果构造方法没有参数,则数组长度为0。
public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			Constructor constructor=clazz.getDeclaredConstructor();
			Class[] clazzs =constructor.getParameterTypes();//得到参数列表存入数组中
			for (Class s : clazzs) {//加强循环遍历该数组,输出参数列表所涉及的参数类
				System.out.println(s.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
3、操作构造方法 —— 创建对象
  • ①void setAccessible(boolean flag):调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
  • ②newInstance(Object… initargs):使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组。
public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			Constructor constructor=clazz.getDeclaredConstructor(String.class);
			constructor.setAccessible(true);
			Object obj=constructor.newInstance("fsr");
			Student stu=(Student)obj;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

属性

1、获取属性
  • ①Field[] getFields():返回一个该Class对象表示类或接口中所有public属性(含继承的)对应的Field对象数组

  • ②Field getField(String fieldName):返回该Class对象表示类或接口中与指定属性名(含继承的)相同的public 属性对应的Field对象

public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			clazz.getField("name");//获取成员变量
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • ③Field[] getDeclaredFields():返回一个该Class对象表示类或接口内定义的所有属性(不含继承的)对应的Field对象数组

  • ④Field getDeclaredField(String fieldName) :返回一个与该Class对象表示类或接口内定义的属性名(不含继承的)相匹配的属性相对应的Field对象

public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			clazz.getDeclaredField("name");//获取成员变量(无论访问权限是什么,都可以获取到)
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
2、获取属性信息
  • ①Class<?> getDeclaringClass():返回声明Field对象表示字段的类或接口所对应的Class对象

  • ②int getModifiers():以整数形式返回Field对象表示的字段的修饰符

  • ③Class<?> getType():返回Field对象所表示字段的数据类型所对应的Class对象(推荐)

  • ④Type getGenericType():返回此Field对象所表示字段的声明类型。

  • ⑤String getName():返回Field对象表示字段的名称

3、操作属性
  • ①void setAccessible(boolean flag):设置或获取属性值时是否忽略访问权限的影响,true表示忽略,false表示不忽略

  • ②Object get(Object obj):返回Field表示字段的Object类型的值。obj为该属性所在类创建的对象,如果该属性是静态的,则可设置为null

  • ③void set(Object obj, Object value):为Field对象表示属性设置新值。obj为该属性所在类创建的对象,如果该属性为静态的则课设置为null;value为该属性新值

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

普通方法

1、获取普通方法
  • ①Method[] getMethods():返回一个该Class对象表示类或接口中所有public方法(含继承的)对应的Method对象数组

  • ②Method getMethod(String methodName, Class<?>… parameterTypes):返回与该Class对象表示类或接口中方法名和方法形参类型相匹配的public方法(含继承的)的Method对象

public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			Method met=clazz.getMethod("doHomework",Integer.TYPE,String.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • ③Method[] getDeclaredMethods():返回一个该Class对象表示类或接口内声明定义的所有访问权限的方法(不含继承的)对应的Method对象数组

  • ④Method getDeclaredMethod(String methodName,Class<?>… parameterTypes) :返回与该Class对象表示类或接口中方法名和方法形参类型相匹配方法(不含继承的)对应的Method对象

public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			Method met=clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
2、获取普通方法信息
  • ①Class<?> getDeclaringClass():返回声明Method对象表示方法的类或接口的 Class 对象

  • ②int getModifiers():以整数形式返回此Method对象所表示方法的修饰符。应该使用Modifier类中的toString方法对所返回的整数进行解码

  • ③Class<?> getReturnType():返回Method对象所表示的方法的返回值类型所对应的Class对象

  • ④String getName():返回方法名

  • ⑤Class<?>[] getParameterTypes():返回由Method对象代表方法的形参类型对应Class对象组成的数组。如果方法没有参数,则数组长度为 0

  • ⑥Class<?>[] getExceptionTypes():返回由Method对象表示方法抛出异常类型对应Class对象组成的数组。如果此方法没有在其 throws子句中声明异常,则返回长度为 0 的数组

3、操作普通方法
  • ①void setAccessible(boolean flag):调用方法时是否忽略访问权限的影响,true表示忽略,false表示不忽略

  • ②Object invoke(Object obj, Object… args):调用Method对象指代的方法并返回Object类型结果。obj表示该方法所在类实例,如果方法时静态的则obj可以指定为null; args表示传入该方法的参数,如果方法没有参数,则args数组长度可以为 0 或 null

public class Test{
	public static void main(String[] args) {
		try{
			Class clazz;
			clazz=Student.class;
			Method met=clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
			met.setAccessible(true);//忽略访问权限的影响
			Object obj=met.invoke(4,"qiang")
			System.out.println(obj)
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
//运行结果:
1*/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值