反射课堂笔记

反射笔记

一、

在这里插入图片描述

1.通过反射机制,在程序运行期间,可以获得相关的类的信息:属性、方法;然后调用方法
2.加载类的过程
3.支持反射的两种语言,c#,java
4.开发通用功能时,即开发框架时使用

二、如何完全复制一个student1,内容荣一样,地址不一样

1.思路:

创建一个跟传入对象类型一致的对象
调用原来的get获取值
调用现在的set 设值

在这里插入图片描述

2.实现

public class ReflectDemo {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub

		Student student1 = new Student("zhangsan", 20, new Date());

		// 完全复制一个student1,内容一样,地址不一样

		Student student2 = (Student) copyObject(student1);

		System.out.println(student1);
		System.out.println(student2);
		
		
	   Class classes[]=new Class[] {String.class,Student.class,Integer.class,};
	   
	   Object objects[]=new Object[] {"zhangsan",new Student()};

//		Student student = new Student();

		// 三种途径获取Class

//	    Class clazz=Class.forName("cn.kgc.reflect.Student");

//		Class clazz=Student.class;

//		Class clazz = student.getClass();

//		Field fields[] = clazz.getDeclaredFields();
//
//		for (Field field : fields) {
//			System.out.println(field.getName());
//			System.out.println(field.getType());
//		}

//	    Method methods[]=student.getClass().getDeclaredMethods();
//	    
//	    for(Method method:methods) {
//	    	System.out.println(method.getName());
//	    }

	}

	private static Object copyObject(Object object) throws Exception {
		// TODO Auto-generated method stub

		/**
		 * 1.创建一个跟传入对象类型一致的对象
		 * 
		 * new ---->构造方法
		 * 
		 * 2.调用原来的get 获取值
		 * 
		 * 3.调用现在的set 设值
		 * 
		 */

		Class clazz = object.getClass();

		// 获取构造方法,无参的构造方法
		Constructor constructor = clazz.getDeclaredConstructor(new Class[] {});

		Object target = constructor.newInstance(new Object[] {});

		// object的get target的set

		Field fields[] = clazz.getDeclaredFields();

		for (Field field : fields) {
			
			/// name age birthday   getName setName getAge setAge 
			
			//拿到了方法的名字get set 
			String getMethodName = "get" + field.getName().substring(0, 1)
					.toUpperCase() + field.getName().substring(1);
			String setMethodName = "set" + field.getName().substring(0, 1)
					.toUpperCase() + field.getName().substring(1);
			
			//获取方法
			
			//new Class[] {}  类型数组
			
			Method getMethod=clazz.getDeclaredMethod(getMethodName, new Class[] {});
			// 调用方法
		    Object value=getMethod.invoke(object, new Object[] {} );
			
		  //获取方法
			Method setMethod=clazz.getDeclaredMethod(setMethodName, new Class[] {field.getType()});
			
			// 调用方法
			setMethod.invoke(target, new Object[] {value});
		}

		return target;
	}

}

补充:Field属性方法
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值