?1.反射是java语言的一种机制,利用反射机制动态的实例化对象(构造函数)、读写属性、调用方法。
?2.类类
package com.dzl;
/**
* 获取类类的类对象的三种方式
* 1.Class.forName
* 2.类.class
* 3.类类的类对象的类实例.getClass();
*/
public class Temp1 {
public static void main(String[] args) throws ClassNotFoundException {
// StuClz1 = Student+Class 简写
Class StuClz1 = Class.forName("com.dzl.Student");
Class StuClz2 = Student.class;//之后通用查询要用到
Class StuClz3 = new Student().getClass();//之后增删改要用到
// 三种模式
}
}
?3.反射实例化
package com.dzl;
import java.lang.reflect.Constructor;
/*
* 反射实例化
*
*/
public class Temp2 {
public static void main(String[] args) throws Exception {
Class<Student> StuClz1 = (Class<Student>) Class.forName("com.dzl..Student");
// TempServlet TempClz1 = Class.forName("com.dzl.TempServlet");
Student stu1 = (Student) StuClz1.newInstance();
// TempServlet temp1 = (Student) StuClz1.newInstance();
stu1.hello() ;
// temp1.dopost(req,resp);
// 反射调用有参构造器
// getDeclaredConstructor与getConstructor的区别
// getDeclaredConstructor 可以获取到私有的构造器以及共有的构造器
// getConstructor 只能获取到公有的
Constructor<Student> c = StuClz1.getConstructor(String.class);
Student s1 = c.newInstance("s001");
Constructor<Student> c2 = StuClz1.getConstructor(String.class,String.class);
Student s2 = c2.newInstance("s001","zs");
Constructor<Student> c3 = StuClz1.getDeclaredConstructor(String.class,String.class);
c3.setAccessible(true);
Student s3 = c3.newInstance(26);
}
}
如果要加有参,一定要带上无参,不然一定会报错误,因为在很多框架的底层,是通过无参的构造对类进行实例化的
?s1 输出结果
?s2输出结果
?s3输出结果
?反射可以通过无参 ,有参 ,私有构造器 ,都可以进行实例化,比oop的实例化方式要更强
4.反射动态方法
package com.dzl;
import java.lang.reflect.Method;
/**
* 反射动态方法调用
* @author zjjt
*
*/
public class Temp3 {
public static void main(String[] args) throws Exception {
Class<Student> StuClz1 = (Class<Student>) Class.forName("com.dzl.Student");
Student s= StuClz1.newInstance();
Method m1 = StuClz1.getDeclaredMethod("hello");
// invoke 参数1:类实例,在这里指的是student类实例 。 参数2:当前被调用的方法,传递的参数值
// invoke的返回值,就是被调用的方法的返回值
System.out.println(m1.invoke(s));
Method m2 = StuClz1.getDeclaredMethod("hello", String.class);
System.out.println(m2.invoke(s,"张三"));
Method m3 = StuClz1.getDeclaredMethod("add", Integer.class, Integer.class);
m3.setAccessible(true);
System.out.println(m3.invoke(s,10,5));
}
}
无参
?有参
?两个有参的
?5.反射读写属性
package com.dzl;
import java.lang.reflect.Field;
/**
* 反射读写属性
* @author zjjt
*
*/
public class Temp4 {
public static void main(String[] args) throws Exception {
Class<Student> StuClz1 = (Class<Student>) Class.forName("com.dzl.Student");
Student s = StuClz1.newInstance();
Field f = StuClz1.getDeclaredField("sname");
f.setAccessible(true);
// 反射写属性
f.set(s,"李四");
System.out.println(s.getSname());
// 反射读属性
System.out.println(f.get(s));
// 比较oop与反射读取属性值的方式
Student st =new Student("s002","王五");
st.age =19;
System.out.println(st.getSid());
System.out.println(st.getSname());
System.out.println(st.age);
// 反射获取对象属性值
Field[] fields = StuClz1.getDeclaredFields();
for (Field ff : fields) {
ff.setAccessible(true);
System.out.println(ff.getName()+":"+ff.get(st));
}
}
}
反射写属性
?
反射读属性
?
oop读取属性值
?
|