javacore 序列化&反射
来源:互联网 发布:监守自盗观后感知乎 编辑:程序博客网 时间:2024/05/17 03:22
序列化
序列化:这种应用发生在要对一个对象做永久性保存的时候,可以把它保存到电脑磁盘,也可以保存到数据库。而在你需要用到这个的时候可以从磁盘或数据库中拿出来。eg:
序列化的对象必须实现java.io.Serializable接口。
package test;
import java.io.Serializable;
public class Person implements Serializable {
/**
* UID 用ID固定这个对象 防止被篡改
*/
private static final long serialVersionUID = 1567747183838728854L;
public Person(){}
public Person(String name, int age) {
System.out.println("test");
this.name = name;
this.age = age;
}
- public String testReflect; //后面反射内容时 测试用!
- private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
序列化:
package test;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class WritePerson {
public static void main(String[] args) throws FileNotFoundException, IOException {
String path = "src/myPerson.bin";
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));
Person p = new Person("Floyd", 18);
out.writeObject(p);
System.out.println("序列化对象成功!");
out.close(); //可以把文件传输流也顺带关闭
}
}
反序列化:
package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ReadPerson {
public static void main(String[] args) throws FileNotFoundException, IOException {
String path = "src/myPerson.bin";
ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));
try {
Person p = (Person) in.readObject();
if(p != null)
System.out.println(p);
else
System.out.println("反序列化对象失败!");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
}
}
}
*实现Externalizable接口可以控制对象的序列化与反序列化,可以在序列化时写非自身的变量。或者只序列化部分对象,篡改对象。
反射
反射能做什么?
1.运行反射机制可以分析类
2.运行反射机制可以分析、修改类
3.可以利用Method方法、操作对象
4.可以利用字符串动态生成
about Java.lang.reflect 包
Class(java.lang.Class<T>)
表示正在运行的Java应用程序中的类和接口
Field
代表类或接口的成员,及相关信息
Method
提供类或接口上单独某个方法(以及访问该方法)的信息
Constructor
提供关于类的单个构造方法的信息以及对他的访问权限。
Array
提供了动态创建和访问Java数组的方法。
Class类
^我们可以简单地将Class看作是类(如:java.lang.String)的代码本身(类的运行时信息)。
^Object类的getClass() 方法将返回对象对应的Class 类实例。
^Class 类的常用方法:
*static Class<?> forName(String className)返回与带有给定字符串名的类或接口相关联的Class对象。*T newInstance()创建此Class 对象所表示的类的一个新实例。
^基本数据类型和关键字void 也表示为Class 对象。
eg:
获取类的方法:
package test;
public class reflectClass {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//1.通过类来得到Class对象
Class<?> clz1 = Person.class;
//2.通过对象来获取其Class信息
Person p = new Person();
Class<?> clz2 = p.getClass();
//3.通过Class.forName()方式获取Class信息
Class<?> clz3 = Class.forName("test.Person");
//使用newInstance()方法时Person类中必须要有一个无参的构造方法,否则会报错
Person person = (Person) clz3.newInstance();
System.out.println(person);
}
}
Field 类(java.lang.reflact.field):
package test;
import java.lang.reflect.Field;
public class reflectField {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Person person = new Person();
person.setReflectTest("test");
person.setName("Tom");
person.setAge(18);
Class<?> clz = person.getClass();
//演示获取公有字段
Field f = clz.getField("reflectTest");
System.out.println(f);
Object obj = f.get(person);
System.out.println(obj);
//演示获取私有字段
Field f2 = clz.getDeclaredField("name");
f2.setAccessible(true);
System.out.println(f2);
Object obj2 = f2.get(person);
System.out.println(obj2);
f2.set(person, "James");
System.out.println(f2.get(person));
//用数组ForEach遍历获取所有字段
Field[] fs = clz.getDeclaredFields();
for (Field field : fs) {
System.out.println(field);
}
}
}
Constructor类:
使用方法与Field异曲同工。
如果是有参的构造方法,构造时需要如下操作(eg:T(int i, String s){this i= i;this s = s;})
Class<T> xxxClz = T.class;
Constructor<T> c = (Constructor<T>)xxxClz.getDeclaredConstructor(int.Class, String.Class);
c.setAccessible(true);
Object obj = c.newInstance(1,"a");
System.out.println(obj);
java.lang.reflect.method 类:
可以获得返回值。
1 0
- javacore 序列化&反射
- javacore
- 反射与序列化
- 反射和序列化
- 反射和序列化
- 什么是反射,什么序列化?
- 什么是反射?什么是序列化
- 概述反射和序列化(转)
- 序列化和反射代码摘取
- 概述反射和序列化(转)
- C++的反射和序列化
- 生成对象-new、clone、序列化、反射
- 使用反射自定义序列化方法
- Java反射机制和对象序列化
- Java序列化,反射,注解(一)
- Java序列化,反射,注解(二)
- 序列化 反射破坏单例模式
- javacore note
- Go 语言概述 ( 上 )
- 技术与技巧札记
- MFC总结(19) --- CStrig转换成十六进制数
- 外观模式
- openssl 证书操作命令
- javacore 序列化&反射
- solr查询语法
- C# 文件操作夹
- 工具使用
- 堆和栈的区别 (数据结构)
- myeclipse中如何在整个工程中搜索字符串
- BZOJ 3524: [Poi2014]Couriers
- 文件的读写操作
- kafka 命令使用说明