1 反射
最经典的就是代理模式啦,代理就好比是放了一个你的克隆人一样,但这个克隆人比你的功能更强,能放出一些你没有的招式,这个克隆人就叫就是你的代理对象;代理又分静态代理和动态代理
1.1 静态代理
直接点来说就是仅仅特定的为某个类做增强,一旦再新来个类,还另需再建代理,不灵活;
1.2 jdk动态代理
灵活,建立的代理类可增强任意类;
怎么创建一个代理对象可以从下边考虑
- 接口 2. 实现类 3. jdk动态代理类实现invocationhandler 4. 工厂模式类获取代理对象Proxy
/*吃的接口*/
public interface Eat {
void eat();
}
/*吃的实现类*/
public class EatImpl implements Eat {
private static final Log log = LogFactory.get();
@Override
public void eat() {
log.info("我吃饭啦");
}
}
/*jdk动态代理*/
public class JdkInvocationHandler implements InvocationHandler {
private static final Log log = LogFactory.get();
/**
* 代理对象
*/
private Object objectProxy;
public JdkInvocationHandler(Object objectProxy) {
this.objectProxy = objectProxy;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
log.info("我饿啦" + method.getName());
Object invoke = method.invoke(objectProxy, objects);
log.info("我饱啦" + method.getName());
return invoke;
}
}
/**工厂模式类获取代理对象Proxy*/
public class FactoryProxy {
/**
* 获取代理对象
*/
public static Object getProxy(Object target) {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces()
, new JdkInvocationHandler(target));
}
}
/**测试类*/
public class Main {
/**
* 推荐创建不可变静态类成员变量
*/
private static final Log log = LogFactory.get();
public static void main(String[] args) {
Eat eatProxy = (Eat) FactoryProxy.getProxy(new EatImpl());
eatProxy.eat();
}
}
效果图
1.3总结
静态代理动态代理的区别:
动态代理比静态代理更加灵活,动态代理一个代理类便可增强其他的类,而静态代理的话,一个代理类只能代理一个特定的类,从jvm层面来讲,静态代理是在编译时期就把接口,实现类直接变成了一个个实际的字节码文件,而动态代理则而在运行时生成字节码文件,然后加载到jvm中并运行
2 集合
2.1 HashMap
前提知识:原码,补码,反码
原码
- 没啥好讲的
反码
- 正数: 原码反码相同
- 负数: 符号位为1,其余原码取反
补码
- 正数: 原码补码相同
- 负数: 符号位为1,反码+1
举例32位电脑,1的原码,补码,反码
- 原码:00000…001
- 反码:00000…001
- 补码:00000…001
举例32位电脑,-1的原码,补码,反码
- 原码:10000…001
- 反码:11111…110
- 补码:11111…111
为什么要有这些东西: 因为计算机里存储的都是补码形式的二进制数,不信可以打开od,往寄存器里放个-1看看;比如向计算机存个-1,计算机中就是1111…1(补码)的形式;
之后呢关于Hashmap看我这篇文章 戳我去HashMap专场