1.、什么是反射
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
2、类类
所有狗 狗类 Dog 狗对象 旺财
所有猫 猫类 Cat 猫对象 肥波
所有类 类类 java.lang.Class 类对象 特定类
3、反射获取类对象
1 class.forname("类全路径名");
2 类名.class
3 类实例.getclass() 代码如下:
package com.lingerqi.student;
/**
* 获取类对象
* 1、class.forname("类全路径名");
* 2、类名.class
* 3、类实例.getclass()
* @author xyls
*
*/
public class test {
public static void main(String[] args) throws ClassNotFoundException {
Class fname = Class.forName("com.lingerqi.student.student");
Class clz=student.class;
// student stu=new student();
// Class clz=stu.getClass();
System.out.println(clz);
}
}
4、 反射三大作用
1 实例化对象
c.newInstance(): 代码如下:
package com.lingerqi.student;
import java.lang.reflect.Constructor;
/**
* 反射实例化
* 1、能够实例化未知的类
* @author xyls
*
*/
public class test2 {
public static void main(String[] args) throws Exception {
Class clz = student.class;
// student stu=(student)clz.newInstance();
// 调用一个参数的构造方法创建一个对象
// Constructor con=clz.getConstructor(String.class);
// student stu=(student)con.newInstance("s001");
// 两个参数的构造方法创建对象
// Constructor con=clz.getConstructor(String.class,String.class);
// student stu=(student)con.newInstance("s001","zs");
Constructor con = clz.getDeclaredConstructor(Integer.class);
con.setAccessible(true);
student stu = (student) con.newInstance(12);
}
}
2 动态调用方法
Method m;
m.invoke
package com.lingerqi.student;
import java.lang.reflect.Method;
/**
* 反射调用方法
* @author xyls
*
*/
public class test3 {
public static void main(String[] args)throws Exception {
student stu=new student();
// stu.hello();
Class clz=stu.getClass();
// Method m=clz.getDeclaredMethod("hello");
// m.invoke(stu);
Method m=clz.getDeclaredMethod("add", Integer.class,Integer.class);
m.setAccessible(true);
m.invoke(stu, 20,4);
}
}
3 读写属性
Field set/get
package com.lingerqi.student;
import java.lang.reflect.Field;
/**
* 反射的赋值取值
* @author xyls
*
*/
public class test4 {
public static void main(String[] args)throws Exception {
student stu=new student();
Class clz=stu.getClass();
// Field field=clz.getDeclaredField("sid");
// field.setAccessible(true);
// field.set(stu, "s002");
// System.out.println(field.get("stu"));
Field[] fields=clz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.getName());
}
}
}

浙公网安备 33010602011771号