Reflect

package com.briup.day13;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.briup.day11.Student;

public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
	//1.获取类镜像,参数是权限类名
	Class clz=Class.forName("com.briup.day11.Student");
	//2.获取该类中的所有属性
	  Field[] f = clz.getDeclaredFields();
	  for(Field temp:f) {
		  //获取属性的数据类型
		  Class c = temp.getType();
		  //获取属性的修饰符
		  int m = temp.getModifiers();
		  //获取属性名
		  String name = temp.getName();
		  //System.out.println(m+":"+c+":"+name);
	  }
	//3.获取所有的方法
	   Method[] methods = clz.getDeclaredMethods();
	   for(Method temp:methods) {
		   //获取方法名
		   String name = temp.getName();
		   //获取返回值类型
		   Class r = temp.getReturnType();
		   //获取修饰符
		   int m = temp.getModifiers();
		   //获取参数列表
		   Class[] c = temp.getParameterTypes();
		   String str="";
		   for(Class t:c) {
			   str+=t;
		   }
		   //System.out.println(m+":"+r+":"+name+":"+str);
	   }
	   //4.获取构造器
	   Constructor[] cst = clz.getDeclaredConstructors();
	     for(Constructor sutt:cst) {
	    	  //获取方法名
			   String name = sutt.getName();
			   //获取修饰符
			   int m = sutt.getModifiers();
			   //获取参数列表
			   Class[] c = sutt.getParameterTypes();
			   String str="";
			   for(Class t:c) {
				   str+=t;
			   }
			  // System.out.println(m+":"+name+":"+str);
	     }
	    //5.实例化类镜像
	      /*Student stu=(Student) clz.newInstance();*/
	     Constructor c=clz.getDeclaredConstructor(int.class,String.class,int.class);
	     Student stu=(Student)c.newInstance(1,"dd",20);
	      Field field = clz.getDeclaredField("name");
	      //第一个参数:实例化的对象
	      //第二个参数,传的值
	      //强制将私有的变量进行改变
	      field.setAccessible(true);
	      field.set(stu, "bb");
	      Method m2=clz.getDeclaredMethod("setName",String.class);
	      m2.invoke(stu, "cc");
	      //调用方法
	        //第一个参数:方法名
	        //第二个参数,参数列表所对应的数据类型String.class,int.class
	      Method m1=clz.getDeclaredMethod("getName", null);
	      //第一个参数:实例化的对象
	      //第二个参数,传的值
	       //注意调用的方法有返回值则接收,没有返回值则不需要接收数据
	       String name=(String) m1.invoke(stu, null);
	       //System.out.println(name);
	       //对于静态方法或变量可以直接传类镜像
	       Method m3=clz.getDeclaredMethod("test", null);
	       m3.invoke(stu, null);
	       m3.invoke(clz, null);
}
}







反射的步骤
1.获取类镜像
1.Class.forName(String className);
2.对象.getClass();
3.数据类型.class
2.通过类镜像获取实例(不通过new操作初始化)
Object obj=类镜像.newInstance();//默认是通过无参构造器初始化对象
3.基于类镜像去操作class对象的属性,方法,构造器
1.获取属性(属性名,修饰符,数据类型)
2.获取方法(方法名,修饰符,参数列表,返回类型)
3.获取构造器(构造器名字,修饰符,参数列表)
4.修改属性的值
5.调用方法 invoke()
6.调用指定的构造器初始化对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值