24反射以及单例模式

反射:【重点】

反射很重要:以后进行封装的时候都有必要书写反射,让代码具有更强的普适性。

反射的本质就是反着来。

1.三种创建Class对象的形式
	Class.forName("").class
	对象.getCalss()
	字节文件.class对象
2.Class下面获取构造方法对象的方法
	getConstructors();
	getDeclaredConstructors();
	getConstructor(Class  ..... parameterType);
	getDeclaredConstructor(Class  ..... parameterType);
3.Class下面获取方法对象的方法
	getMethods();
	getDeclaredMethods();
	getMethod(String name, Class .... parameterType);
	getDeclaredMethod(String name, Class .... parameterType);
4.Class下面获取属性对象的方法
	getFields();
	getDeclaredFields();
	getField(String name);
	getDeclaredField(String name);
5.Constructor对象下面的方法
	newInstance(); 通过构造方法创建了实例对象
	setAccessible(true);
6.Method对象下面的方法
	setAccessible(true);//强行执行
	invoke(Object  obj, Object ... param);
7.Field对象下面的方法
	setAccessible(true);//强行执行
	set(Object obj, Object value);

Java中的模式:

在这里插入图片描述

单例模式:

要求在整个程序运行过程中,只出现一个实例对象。减少内存的消耗。

如何判断两个对象或者多个对象是否是单例,看内存地址。

单例模式的两种写法:

懒汉式写法:

package com.qfedu.a_single;

//懒汉式写法
class Person {
    private static Person person;
    private Person () {

    }
    public static synchronized Person getInstance ()  {
        if  (person == null) {
            person = new Person();
        }
        return person;
    }
}

饿汉式写法:

package com.qfedu.a_single;

class Cat {
    private static final Cat cat = new Cat();
    private Cat() {

    }
    public static Cat getIntance () {
        return cat;
    }
}
public class Demo3 {
    public static void main(String[] args) {
        Cat intance = Cat.getIntance();
        Cat intance1 = Cat.getIntance();
        System.out.println(intance);
        System.out.println(intance1);

    }

}

两者之间的区别:

懒汉式:线程不安全

饿汉式:线程安全

效率来说:饿汉式效率高,因为不用加锁。

性能来说:饿汉式一加载就实例出对象。但是懒汉式调用方法的时候才进行创建对象,懒汉式的内存消耗是小于饿汉式的。

序列化:

类ObjectInputStream(反序列化) 和 ObjectOutputStream(序列化) 是高层次的数据流,它们包含反序列化和序列化对象的方法。

序列化能干嘛? 将一个类对象信息(构造方法,属性,方法)可以写到本地一个文件中。这叫序列化。从文件中读取一个对象的信息,这叫反序列化。

序列化注意事项:

​ 1.被序列化的实体类必须实现一个接口 Serializable,不然不能被序列化

序列化案例:

将一个对象赋值完以后写到到本地。ObjectOutputStream

package com.qfedu.b_serialize;

import java.io.*;
import java.util.ArrayList;

public class Demo1 {
    public static void main(String[] args) throws Exception {
        //序列化:将对象存到一个文件中
        Employee employee = new Employee();
        employee.name = "骚磊";
        employee.address = "月球";
        employee.number = 100;
        employee.mailCheck();
        //将employee对象进行序列化 存到一个文件中  序列化的文件的后缀都是.ser
        FileOutputStream fos = new FileOutputStream(new File("c:/aaa/emp.ser"));
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fos);
        objectOutputStream.writeObject(employee);
        objectOutputStream.close();
        fos.close();
        System.out.println("写入成功");


    }
}

反序列化

将本地的文件信息(被序列化过的)写到一个对象中

ObjectInputStream

package com.qfedu.b_serialize;

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class Demo2 {
    public static void main(String[] args) throws Exception{
        //进行反序列化
        FileInputStream fis = new FileInputStream(new File("c:/aaa/emp1.ser"));
        ObjectInputStream ois = new ObjectInputStream(fis);
        Employee emp = (Employee)ois.readObject();
        System.out.println(emp.name);
        System.out.println(emp.number);
        System.out.println(emp.address);
        System.out.println(emp.sb);
        emp.mailCheck();

    }
}

总结:序列化将对象的值存到本地磁盘的文件中以作备份。反序列化可以将本次磁盘序列化过的文件读取到实体类的对象中。

  System.out.println(emp.address);
    System.out.println(emp.sb);
    emp.mailCheck();

}

}


总结:序列化将对象的值存到本地磁盘的文件中以作备份。反序列化可以将本次磁盘序列化过的文件读取到实体类的对象中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值