
个人简介:
📦个人主页:赵四司机
🏆学习方向:JAVA后端开发
📣种一棵树最好的时间是十年前,其次是现在!
🔔博主推荐网站:牛客网 刷题|面试|找工作神器
💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。
前言
由于很快到了金九银十的秋招季节,博主最近也在找一些面经资源,但是发现很多都不全,后来我发现了牛客网这个网站,发现里面不仅可以看面经,还能刷题模拟面试,要是你要找各种招聘信息也可以在上面找到,我愿称之为程序员必备网站,下面把它推荐给你们!
链接地址:牛客网

序列化:需要持久化Java对象而将数据结构或对象转换成二进制字符流的过程。
反序列化:将序列化过程中产生的二进制字符流转换成数据结构或者Java对象。
使用场景:
序列化与反序列化发生在OSI七层模型中的表示层,属于TCP/IP协议应用层的一部分。
ThreadPoolExecutor构造方法中的7个参数:
简单来说,在执行execute()方法时候如果状态一直是Running时,执行过程如下:
代理模式是指使用代理对象来代替对真实对象的访问,这样就可以在不修改原目标对像的情况下提供额外的功能操作,扩展目标对像的功能,比如在某个对象的执行方法前后增加一些自定义的操作。通过代理模式,可以实现对真实角色的保护,有时候代理增强逻辑中可以判断是否去执行其代理的真实对象的业务逻辑;除此之外,还能实现低耦合高内聚,拓展性强,可以实现用不同的代理类,做不一样的代理操作,方便更换具体的增强逻辑。
静态代理实现步骤:
静态代理很好的实现了在不修改原有代码的基础上进行业务拓展的功能,这也是它主要的功能。但是静态代理是代理类在创建的时候,接口以及代理类就已经确定了,因此一个静态代理类只能代理一个类,如果要代理的方法很多,势必要对为一个方法进行代理,造成代码的冗余 。除此之外,假如接口新增了一个方法,除了实现类要实现这个方法之外,所有代理类也需要实现这个方法,这就增加了代码维护的复杂度。
代码实现:
package baguwen.proxy;
public interface takeout {
void orderTakeouts();
}
package baguwen.proxy;
public class takeoutImpl implements takeout{
@Override
public void orderTakeouts() {
System.out.println("成功点了一份炸鸡");
}
}
package baguwen.proxy;
public class takeProxy implements takeout{
private takeout takeout01;
public takeProxy(takeout takeout01) {
this.takeout01 = takeout01;
}
@Override
public void orderTakeouts() {
System.out.println("下订单");
takeout01.orderTakeouts();
System.out.println("评价");
}
}
package baguwen.proxy;
public class test {
public static void main(String[] args) {
takeoutImpl takeimpl = new takeoutImpl();
takeProxy proxy = new takeProxy(takeimpl);
proxy.orderTakeouts();
}
}
动态代理是你想让他代理谁就代理谁,它会给你生成一个代理对象(代理你指定的类),用其完成具体代码逻辑。动态代理类的源码是在程序运行期间有JVM根据反射、ASM生成Java的字节码等机制动态生成,所以不存在代理类的字节码文件,代理类和委托类的关系都是在程序运行时确定。(ASM:一个小而快的字节码处理框架,用来转换字节码并生成新的类)。
代码示例:
创建一个接口及其实现类:
package baguwen.dongtaiProxy;
public interface takeout {
void orderTakeouts();
}
package baguwen.dongtaiProxy;
public class takeoutImpl implements takeout{
@Override
public void orderTakeouts() {
System.out.println("成功点了一份炸鸡");
}
}
自定义InvocationHandler并重写invoke方法
package baguwen.dongtaiProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理
*/
public class proxyHandler implements InvocationHandler{
//被代理对象
private Object targetObject;
/**
* 获取代理对象
* @param targeObject
* @return
*/
public Object getProxyInstance(Object targeObject) {
this.targetObject = targeObject;
//第一个参数:被代理对象的类加载器
//第二个参数:被代理对象的所有接口
//第三个参数:当前对象,当前对象实现了InvocationHandler所以有invoke方法,通过invoke方法可以实现被代理对象的方法
return Proxy.newProxyInstance(targeObject.getClass().getClassLoader(), targeObject.getClass().getInterfaces(), this);
}
//proxy:被代理的对象
//method:要调用的方法
//args:方法需要的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("下订单");
Object result = method.invoke(targetObject, args);
System.out.println("评价");
return result;
}
}
通过Proxy.newProxyInstance创建代理对象
package baguwen.dongtaiProxy;
public class test {
public static void main(String[] args) {
proxyHandler proxyHandler = new proxyHandler();
takeout takeIpml = (takeout) proxyHandler.getProxyInstance(new takeoutImpl());
takeIpml.orderTakeouts(); //自动调用invoke方法
}
}
当动态代理对象调用原生方法时候,最终实际上调用的是invoke方法,然后invoke方法替代我们去调用了被代理对象的原生方法。
温馨提示:上面只是我总结的面经知识,如果你想要更全面的可以到网站自行查看喔。
友情链接:牛客网