1.反射
反射:Java语言中的一种机制,通过这种机制可以动态的实
1.类类
什么叫类类:如 小白 ,小黑 ,小红 ,Dog狗类 : 菲波 , 加菲,煤球 Cat猫来类 : 刘鑫 ,刘文,刘志 人类, 他们的是类可是他们分别是狗类,猫类,人类。。。。可是他们都是类类中的,类类就是java.reflect.Class类的
1.1类类的获取方式
package zhanghao;
public class zhanghao { public static void main(String[] args) throws Exception { Student stu=new Student(); // 这个就是类类,应用在jdbc数据库链接中,自己导入的是什么数据库就是连接的是什么数据库
1.11 Class.forName
// 因为他继承了他底层的驱动 Class c1=Class.forName("zhanghao.Student"); System.out.println(c1);
1.12 类实例.getClass()
// 通用在增删改的方法上 Class c2 = stu.getClass(); System.out.println(c2);
1.13 类名.Class
// 通用查询的方法 Class c3=Student.class; System.out.println(c3); } }
2.反射实例
所以的实体类,添加了有参构造器,一定记得补一个无参构造器
// 一切反射都是从类类开始的
2.1.调用无参构造器反射实例化
Class c=Class.forName("zhanghao.Student"); Student s1= (Student) c.newInstance(); System.out.println(s1); // 有了有参构造器无参构造器就不存在了
2.2.调用有一个参数的构造器实例化;
// parameterTypes:代表了参数的类别 Constructor cr1= c.getConstructor(String.class); // 先拿到cr1构造器在实例化 Student s2= (Student) cr1.newInstance("zhanghao"); System.out.println(s2);
2.3.调用有2个参数的构造器实例化
Constructor cr2= c.getConstructor(String.class,String.class); Student s3 = (Student) cr2.newInstance("s2001","nd"); System.out.println(s3);
2.4.调用私有的带了一个参数的构造器
// getConstructor这个方法只能获取到公有的构造器对象 Constructor cr3= c.getDeclaredConstructor(Integer.class); cr3.setAccessible(true); Student s4 = (Student) cr3.newInstance(19); System.out.println(s4);
3.反射方法的调用
3.1反射调用没有参数的方法 要先获取方法对象
// name:方法名 ; parameterTypes:调用这个方法要传的参数类型 Method m1=c.getMethod("hello"); // odj:;类实例; args:参数值 Object invoke = m1.invoke(stu); System.out.println(invoke);
3.2反射调用有参方法
Method m2=c.getMethod("hello",String.class); Object invoke2 = m2.invoke(stu,"大帅哥"); System.out.println(invoke2);
3.3调用 有参数 私有的方法
Method m3=c.getDeclaredMethod("add",Integer.class,Integer.class); m3.setAccessible(true); Object invoke3 = m3.invoke(stu, 1,2); System.out.println(invoke3); }
4.反射读写属性
这个点会在增删改查的时候用
package zhanghao;
import java.lang.reflect.Field; import java.lang.reflect.Method;
public class zhanghao4 { public static void main(String[] args) throws Exception, Exception {
Class clz=Student.class;
Student stu=new Student("soo1","nb");
// 获取到学生的stu的sid值以及sname值 System.out.println(stu.getSid()); System.out.println(stu.getSname());
System.out.println("************************************");
Field sname = clz.getDeclaredField("sname");
sname.setAccessible(true);
sname.set(stu, "lx");
// Field:属性对象 Field[] fields= clz.getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); System.out.println(f.getName()+":"+f.get(stu)); } /*这是固定代码 *req.getParameterMap *student s=new student() *for(Entry entry:map.entrySet()){ *string key=entry.getkey *string value =entry.getvalue * *Field snameField=clz.getDeclardField(key); *snameField.setAccessible(true); *snameField.set(s,value); *} */ } }