反射笔记
一、
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属性方法