java基础3

2019-12-30  本文已影响0人  明鬼mio
1.死锁
2.类加载过程
image.png
3.synchronized底层实现原理

https://blog.csdn.net/javazejian/article/details/72828483

4.synchronized与Lock的区别
5.反射
Class c1 = Class.forName(“java.lang.String”);

2).直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高

Class c2 = String.class;

3).通过对象调用 getClass() 方法来获取,通常应用于不知道具体是什么类

String str = new String("Hello");
Class c3 = str.getClass();
Class clz = Phone.class;
Phone phone = (Phone)clz.newInstance();

2).通过 Constructor 对象的 newInstance() 方法

Constructor constructor = clz.getConstructor();
Phone phone= (Phone)constructor.newInstance();

通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法

Class clz = Phone.class;
Constructor constructor = clz.getConstructor(String.class, int.class);
Phone phone = (Phone) constructor.newInstance("华为",6666);
6.java序列化

某个类可以被序列化,则其子类也可以被序列化
声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据
反序列化读取序列化对象的顺序要保持一致

7.动态代理
java动态代理
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

newProxyInstance方法用来返回一个代理对象,这个方法总共有3个参数:
ClassLoader loader用来指明生成代理对象使用哪个类装载器;
Class<?>[] interfaces用来指明生成哪个对象的代理对象,通过接口指定;
InvocationHandler h用来指明产生的这个代理对象要做什么事情。
所以我们只需要调用newProxyInstance方法就可以得到某一个对象的代理对象了。

public Object invoke(Object proxy,Method method,Object args){
method.invoke();
}

proxy:代理对象
method:代理对象调用的方法
args:方法参数

cglib动态代理
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Cglib动态代理,监听开始!");
        Object invoke = method.invoke(代理对象,参数数组);
        System.out.println("Cglib动态代理,监听结束!");
        return invoke
 }
//定义获取代理对象方法
    public Object getCglibProxy(Object objectTarget){
        //为目标对象target赋值
        this.target = objectTarget;
        Enhancer enhancer = new Enhancer();
        //设置父类,因为Cglib是针对指定的类生成一个子类,所以需要指定父类
        enhancer.setSuperclass(objectTarget.getClass());
        enhancer.setCallback(this);// 设置回调 
        Object result = enhancer.create();//创建并返回代理对象
        return result;
    }
8.克隆

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。
简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
1.被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)
2.覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)


image.png

深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。


image.png

序列化就是将对象写到流的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆。需要注意的是能够实现序列化的对象其类必须实现Serializable接口,否则无法实现序列化操作。

上一篇 下一篇

猜你喜欢

热点阅读