1 框架的概念
写好的程序的半成品:大师根据功能或者某层搭好的软件基础:
程序员在框架的基础上进行开发
框架: 提高开发效率 降低开发难度
常见的框架:
hibernate:持久层(替代jdbc)
mybatis:持久层(替代jdbc)
springmvc:控制层(替代servlet)
struts2:控制层(替代servlet)
mybatisplus:持久层(替代jdbc)
spring:中间层(整合其他层和技术)
springsecurity:权限
fastdfs:图片服务器
oss:图片服务器
sso:点单登录·
2 框架基础
框架底层的技术:
1 反射 reflect
2 注解 annotation
3 xml dom解析
4 代理 proxy
5 io
6 socket
7 序列化:ObjectStream
3 反射
反射:通过类的字节码文件 动态的创建对象和获取类的成员
参照:杀鸡取卵、守株待兔
反射相关的四个类:Class:类的字节码文件对象
Constructor:类的构造方法对象
Field:类的成员变量对象
Method:类的普通方法对象
4 Class类
4.0 准备工作
package com.zhiyou100.demo012_reflect;
public class Student {
private int sid;
private String sname;
private float score;
private String sex;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student(int sid, String sname, float score, String sex) {
System.out.println("构造方法:public Student(int sid, String sname, float score, String sex)");
this.sid = sid;
this.sname = sname;
this.score = score;
this.sex = sex;
}
public Student() {
System.out.println("构造方法:public Student()");
}
public void hehe(){
System.out.println("普通方法::public void hehe()");
}
public double haha(int a,float b){
System.out.println("普通方法::public double haha(int a,float b)");
return a+b;
}
private void hh(){
System.out.println("普通方法::private void hh()");
}
}
4.1 获取一个类的字节码文件对象的方式
Student student=new Student();
Class cla1=student.getClass();
System.out.println(cla1);
Class cla2=Student.class;
System.out.println(cla2);
System.out.println(cla1==cla2);
Class cla3=Class.forName("com.zhiyou100.demo012_reflect.Student");
System.out.println(cla3);
4.2 研究Class类中的方法
System.out.println("获取类名(包名.类名):getName::"+cla1.getName());
System.out.println("获取类名:getSimpleName::"+cla1.getSimpleName());
Student s2=(Student)cla1.newInstance();
System.out.println(s2);
System.out.println("获取所有的public修饰的构造方法对象::getConstructors::"+Arrays.toString(cla1.getConstructors()));
System.out.println("获取所有的构造方法对象::getDeclaredConstructors::"+Arrays.toString(cla1.getDeclaredConstructors()));
System.out.println("获取public修饰的无参数的构造方法::getConstructor::"+cla1.getConstructor(null));
System.out.println("获取public修饰的参数类型为double的构造方法::getConstructor::"+cla1.getConstructor(double.class));
System.out.println("获取任意修饰的参数类型为double的构造方法::getDeclaredConstructor::"+cla1.getDeclaredConstructor(int.class));
System.out.println("获取public修饰的某个成员变量:getField"+cla1.getField("a"));
System.out.println("获取任意修饰的某个成员变量:getDeclaredField"+cla1.getDeclaredField("c"));
System.out.println("获取public修饰的所有成员变量:getField"+Arrays.toString(cla1.getFields()));
System.out.println("获取任意修饰的所有成员变量:getDeclaredField"+Arrays.toString(cla1.getDeclaredFields()));
System.out.println("获取public修饰的某个普通方法:getMethod"+cla1.getMethod("haha", int.class,float.class));
System.out.println("获取任意修饰的某个普通方法:getDeclaredMethod"+cla1.getDeclaredMethod("hh"));
System.out.println("获取public修饰的所有普通方法:getMethods"+Arrays.toString(cla1.getMethods()));
System.out.println("获取任意修饰的所有普通方法:getDeclaredMethods"+Arrays.toString(cla1.getDeclaredMethods()));
5 Constructor类
Class cla1=Class.forName("com.zhiyou100.demo012_reflect.Student");
Constructor con1=cla1.getDeclaredConstructor(int.class,String.class,float.class,String.class);
System.out.println(con1);
System.out.println("getName:获取方法名:"+con1.getName());
System.out.println("getModifiers:获取修饰符:"+con1.getModifiers());
System.out.println("getParameterTypes:获取参数列表类型:"+Arrays.toString(con1.getParameterTypes()));
Student s1=(Student)con1.newInstance(1,"eheh",1.1f,"男");
System.out.println("s1="+s1);
con1=cla1.getDeclaredConstructor(int.class);
System.out.println(con1);
con1.setAccessible(true);
s1=(Student)con1.newInstance(1);
System.out.println("s1="+s1);
6 Field类
Class cla1=Class.forName("com.zhiyou100.demo012_reflect.Student");
Field f1=cla1.getDeclaredField("sex");
Student s1=new Student(101, "韩梅梅", 11f, "女");
f1.setAccessible(true);
f1.set(s1, "妖");
System.out.println("获取s1对象的sex属性的值:"+f1.get(s1));
System.out.println(s1);
System.out.println("获取属性名:"+f1.getName());
System.out.println("获取属性类型:"+f1.getType());
System.out.println("获取属性修饰符:"+f1.getModifiers());
7 Method类
Class cla1=Class.forName("com.zhiyou100.demo012_reflect.Student");
Method m1=cla1.getDeclaredMethod("haha", int.class,float.class);
System.out.println("m1==="+m1);
System.out.println("getName:获取方法名::"+m1.getName());
System.out.println("getName:获取方法修饰符::"+m1.getModifiers());
System.out.println("getName:获取方法返回值类型::"+m1.getReturnType());
System.out.println("getName:获取方法参数列表::"+Arrays.toString(m1.getParameterTypes()));
System.out.println("getName:获取方法抛出的异常类型::"+Arrays.toString(m1.getExceptionTypes()));
Student s1=new Student(101, "韩梅梅", 11f, "女");
m1.setAccessible(true);
Object result=m1.invoke(s1, 11,22.1f);
System.out.println("方法返回值值:"+result);
总结:
反射其实就是4个类+(4+1+2+1)个方法