JAVA反射的使用

本文主要从以下几点来学会如何使用反射

  1. 如何获取一个类
  2. 如何获取属性(成员变量)
  3. 如何获取构造方法
  4. 如何获取普通方法
  5. 如何使用反射执行方法
  6. 如何执行get/set方法

实列

1:获取类的几种方法

//  如何获取类
	@Test
	public void test() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		Class<?> cls = Class.forName("com.rep.pojo.Person");//1根据字符串获取类型
		Person p1 = new Person();//创建对象(静态)
		Class cls2 = p1.getClass();//2根据对象获取其类型
		Class cls = Person.class;//3
	}

总结:
1:Class.forName(“从包路径到类的名称”);
2:类名称.Class;
3:对象.getClass;

2:获取属性的方法(成员变量)

	public void test1(){
		Class cls = Person.class;
//		获取当前类的成员变量的集合
		Field[] fields = cls.getDeclaredFields();
		System.out.println("public class "+ cls.getName()+"{");
		for (Field field : fields) {
			String fname = field.getName();//取成员的名称
			Class<?> fType = field.getType();//取成员的类型
			String ftypeName = fType.getName();//获取成员类型的名称
			String nftname = ftypeName.substring(ftypeName.lastIndexOf(".")+1);//取类型的短名称
		    int fm = field.getModifiers();//获取成员的修饰符的值
		    String fmName = Modifier.toString(fm);//获取成员修饰符的字面值(名)
			System.out.println(fmName +" "+nftname+" "+fname +";");
		}
		System.out.println("}");
	}

3:获取构造方法

	public void test2(){
		Class cls = Person.class;
		System.out.println("public class "+ cls.getName()+"{");
		Constructor[] constructors = cls.getDeclaredConstructors();//获取所有的构造方法
		for (Constructor c : constructors) {
			String  cname = c.getName();//获取构造方法的名称
			
		String cmName = Modifier.toString(c.getModifiers());//获取构造方法的限定词(访问修饰符)
		System.out.print(cmName+" " +cname+"(");
		Class[] ccls = c.getParameterTypes();//获取构造方法的参数类型的数组
		  for (int i = 0; i < ccls.length; i++) {
			String parameterTypeName =   ccls[i].getName();//获取参数类型的名称
			System.out.print(parameterTypeName+" arg"+i+" ,");
		}
			System.out.println(")");
		}
		System.out.println("}");
	}

4:获取普通方法

public void test3(){
		Class cls = Person.class;
		System.out.println("public class "+ cls.getName()+"{");		
		Method[] methods = cls.getDeclaredMethods();//获取类的所有方法
		for (Method m : methods) {
			String methodName = m.getName();//获取方法名
			Class<?> returnCls = m.getReturnType();//获取方法的返回值类型
			String rtName = returnCls.getSimpleName();//获取返回值类型的短名称
			String mname = Modifier.toString(m.getModifiers());//获取方法的访问修饰符
			System.out.print(mname+" "+rtName+" "+methodName+"(");
			Class<?>[] paramTypes = m.getParameterTypes();//获取该方法的参数类型的数组
			for (int i = 0; i < paramTypes.length; i++) {
				String ptName = paramTypes[i].getSimpleName();//获取方法参数类型的短名称
				System.out.print(ptName+" arg"+i+",");			
			}
			System.out.println(")");		
		}
		System.out.println("}");
	}

5:使用反射执行方法

	public void test4() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{
		Class cls = Person.class;//获取类型
		Method method = cls.getDeclaredMethod("sayHello", String.class);//根据方法名+参数列表获取方法名;
		Object obj = cls.newInstance();//通过类型动态(运行时)创建对象
		String name = "zhang san ";//构造方法执行的参数对象
		Object returnVal = method.invoke(obj, name);//使用obj对象执行其method方法,并送入实参name,放回Object类型的结果值
		System.out.println(returnVal);
	}

6:执行get/set方法

	public void Test5() throws IntrospectionException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		Class cls = Person.class;//获取类型
		String key = "pname";
		PropertyDescriptor pd = new PropertyDescriptor(key, cls);//构造一个属性描述对象
		Method setMethod = pd.getWriteMethod();//获取某属性的写方法  ;getReadMethod()回去读方法
		Object obj = cls.newInstance();
		setMethod.invoke(obj, "lisi");
		System.out.println(obj);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值