Java基础:反射

一:什么是反射?

反射库提供了一个精心设计的工具集,以便编写能够动态操纵java代码的程序;能够分析类能力的程序称为反射。

二:反射可以干什么?

  • 在运行时分析类的能力
  • 在运行时查看对象
  • 实现通用的数组操纵代码
  • 使用Method对象

三:Class类

在程序运行期间,java会追踪每一个对象所属的类,并获取,保存这个类的所有信息,保存这些信息的类被叫做Class;

Class类实际上是一个泛型类,

四:如何获取反射对象?

  • 类.class
Class<TestBean> clazz=javaBean.class;
  • 对象.getClass()
Class clazz=javabean.getClass();
  • Class.forName(包名+类名)
Class clazz=Class.forName("com.cxt.vo.javaBean");

五:通过反射分析类的能力

  • 获取类的名字
String className=clazz.getSimpleName();//通过反射对象获取类名
  • 获取目标对象
Object obj=clazz.newInstance();  //等效于 new javaBean();
  • 获取属性的类型和名字
Field[] fields= clazz.getFields();//只获取公共的属性
Field[] fields=clazz.getDeclaredFields();//获取所有的属性


for(Field field:fields){
			//获取属性名
			String name=field.getName();
			//获取属性类型
			Class fieldClazz=field.getType();
		}
  • 操作单个属性:可以给属性(包括私有属性,需要取消该属性的安全性监测)存值,取值(要求原来的类有set,get方法)
public static void testField(){
		try {
			Class clazz=TestBean.class;
			Object obj=clazz.newInstance();
			/*Field phone=clazz.getField("phone");
			//存值      对象.setPhone("138888888");
			phone.set(obj, "138888888");//obj.setPhone("111111");
			//取值     对象.getPhone();
			Object phoneVal=phone.get(obj);
			System.out.println(phoneVal);*/
			
			/*Field mail=clazz.getField("mail");
			//类.属性名=值     
			mail.set(null, "123456@qq.com");
			//类.属性名
			Object mailVal=mail.get(null);
			System.out.println(mailVal);*/
			
			
			Field id=clazz.getDeclaredField("id");//获取私有属性
			//取消java的底层安全性监测
			id.setAccessible(true);
			id.set(obj, 9527);//给私有属性存值,取值,需要取消java的底层安全性检测
			Object idVal=id.get(obj);
			id.setAccessible(false);
			System.out.println(idVal);
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
  • 操作方法
  1. 获取所有方法及其方法名
	/**
	 * 通过反射模板获取多个方法
	 */
	public static void testMethods(){
		//获取反射模板
		Class clazz=TestBean.class;
		
		//获取自己及超类所有公共的方法集合
         //Method[] methods=clazz.getMethods();
		//获取所有的方法集合
		Method[] methods=clazz.getDeclaredMethods();
		System.out.println(methods.length);
		for(Method method:methods){
			//获取方法名
			String methodName=method.getName();
			System.out.println(methodName);
		}
	}

2.执行方法:方法对象.invoke()

/**
	 * 通过反射模板获取单个方法
	 */
	public static void testMethod(){
		try {
			Class clazz=TestBean.class;
			Object obj=clazz.newInstance();
//			Method test=clazz.getMethod("test");
			//执行方法
			//对象.方法名(实参列表)
			//方法对象.invoke()
//			test.invoke(obj);
			
//			Method hello=clazz.getMethod("hello", String.class);
//			hello.invoke(null, "周星驰");
			
			
			Method add=clazz.getDeclaredMethod("add",int.class,int.class);
			add.setAccessible(true);
			Object result=add.invoke(obj, 333,333);
			add.setAccessible(false);
			System.out.println(result);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
  • 获取所有构造器
/**
	 * 通过反射模板获取多个构造器
	 */
	public static void testConstructors(){
		Class clazz=TestBean.class;
//		Constructor[] cons=clazz.getConstructors();
		Constructor[] cons=clazz.getDeclaredConstructors();
		System.out.println(cons.length);
	}
  • 获取单个构造器,通过构造器创建对象实例
/**
	 * 通过反射模板获取单个构造器
	 */
	public static void testConstructor(){
		try {
			Class clazz=TestBean.class;
			//Constructor<TestBean> con=clazz.getConstructor();
			//通过构造器创建对象实例
//			TestBean bean=con.newInstance();// clazz.newInstance    new TestBean()
//			System.out.println(bean);
			
//			Constructor<TestBean> con=clazz.getConstructor(int.class,String.class);
//			TestBean bean=con.newInstance(666,"周润发");
//			System.out.println(bean);
			
			
			Constructor<TestBean> con=clazz.getDeclaredConstructor(String.class,int.class);
			con.setAccessible(true);
			TestBean bean=con.newInstance("啊啊啊",18);
			con.setAccessible(false);
			System.out.println(bean);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值