企业面试题
面向过程编程思想? c 语言 c++
面向对象编程思想? java语言、
什么叫面向对象编程?
java语言去描述这个世界:归类:个体都有一个类
学生:张三-----》学生类-- 特征(成员属性):学号、姓名、年龄–功能(method方法):学习,阅读计算
王老师—》》老师类–特征:工号、工资、工龄、学科—功能:能力:教书、备课、
aop:面向切面编程思想?
与业务需求强相关的功能,是由自己来做,不是强相关的功能(权限、日志等),通过面向切面的方式找到代理人完成
引入
老师: 授课、
代理人(班长):点名、收发作业
JDK动态代理
1-编写teacher接口和实现类
public interface Teacher {
//上课
public void teach();
}
public class TeacherImpl implements Teacher {
@Override
public void teach() {
System.out.println("上课");
}
}
2-编写切面类(目标类):编写需要代理的方法
//切面类:需要其他人帮忙做的事情
public class MyAspect {
//点名
public void callName(){
System.out.println("点名");
}
//收发作业
public void collectHomework(){
System.out.println("收发作业");
}
}
3-编写代理机制类:如何创建代理人/代理规则
//aop思想的是时候是没有用到框架;
//负责执行代理规则和创建代理人
public class JdkProxy implements InvocationHandler {
private Teacher teacher;
//创建代理人 proxy:代理 -被代理人 teacher
public Object createProxy(Teacher teacher){
this.teacher=teacher;
ClassLoader loader=JdkProxy.class.getClassLoader();
Class<?>[] interfaces=teacher.getClass().getInterfaces();
return Proxy.newProxyInstance(loader,interfaces,this);
}
//制定代理方式和过程: 点名-上课-点名
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyAspect myAspect = new MyAspect();
//点名
myAspect.callName();
//上课:由老师来上课
Object o = method.invoke(teacher, args);
//点名
myAspect.callName();
return o;
}
}
4-测试
public static void main(String[] args) {
// 创建代理人
JdkProxy jdkProxy= new JdkProxy();
Teacher teacher=new TeacherImpl();
//形成代理人
Teacher miaomiao = (Teacher) jdkProxy.createProxy(teacher);
//代理人代理老师,进行工作
miaomiao.teach();
}
1-编写老师接口和实现类
public interface Teacher {
//上课
public void teach();
}
public class TeacherImpl implements Teacher {
//老师上课
public void teach() {
System.out.println("上课");
}
}
2-编写切面类
// 和老师主要工作不是密切相关的工作
public class MyAspect {
//点名
public void callName(){
System.out.println("点名");
}
//收发作业本
public void collectExerciseBook(){
System.out.println("收发作业本");
}
}
3-编写代理机制类
public class CglibProxy implements MethodInterceptor {
//创建代理人
public Object createProxy(Object o){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(o.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
//代理规则
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
MyAspect myAspect=new MyAspect();
//前置增强
myAspect.callName();
//执行被代理类的方法
Object object = methodProxy.invokeSuper(o, objects);
//后置增强
myAspect.callName();
return object;
}
}
4-测试
public static void main(String[] args) {
//创建代理人
CglibProxy cglibProxy = new CglibProxy();
Teacher teacher=new TeacherImpl();
Object proxy = cglibProxy.createProxy(teacher);
//代理人代理的是老师,强转成老师
Teacher teacher1 = (Teacher) proxy;
teacher1.teach();
}