反射:【重点】
反射很重要:以后进行封装的时候都有必要书写反射,让代码具有更强的普适性。
反射的本质就是反着来。
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();
}
}
总结:序列化将对象的值存到本地磁盘的文件中以作备份。反序列化可以将本次磁盘序列化过的文件读取到实体类的对象中。