反射笔记

一、

反射课堂笔记_调用方法

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

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

1.思路:

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

反射课堂笔记_java_02

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属性方法

反射课堂笔记_对象类型_03