目录
反射
1.什么是java的反射机制?
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制。
2.获取class的方式
在Java 中可以通过三种方法获取类的字节码(Class)对象
- 通过Object 类中的getClass() 方法,想要用这种方法必须要明确具体的类并且创建该类的对象。
- 所有数据类型都具备一个静态的属性.class 来获取对应的Class 对象。但是还是要明确到类,然后才能调用类中的静态成员。
- 只要通过给定类的字符串名称就可以获取该类的字节码对象,这样做扩展性更强。通过Class.forName()方法完成,必须要指定类的全限定名,由于前两种方法都是在知道该类的情况下获取该类的字节码对象,因此不会有异常,但是Class.forName()方法如果写错类的路径会报 ClassNotFoundException 的异常。
public class ReflectTest {
public static void main(String[] args) {
Fruit fruit = new Fruit();
Class<?> class1 = fruit.getClass(); //方法一
Class<?> class2 = Fruit.class; //方法二
Class class3 = null;
try { //方法三,如果这里不指定类所在的包名会报 ClassNotFoundException 异常
class3 = Class.forName("com.jas.reflect.Fruit");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(class1 + " " +class2 + " " + class3);
}
}
class Fruit{}
3.使用反射生成并操作对象
创建对象
调用方法
demo
Class<?> userClass = Class.forName("com.lf.entity.UserEntity");
UserEntity userEntity = (UserEntity) userClass.newInstance();
//得到方法对象,有参的方法需要指定参数类型
Method repay1 = userClass.getMethod("repay",int.class);
//执行还钱方法,有参传参
repay1.invoke(userEntity,3000);
动态代理
参照印象笔记中的相关笔记
1.动态代理是什么?有哪些应用?
动态代理:
当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。
动态代理的应用:
Spring的AOP
加事务
加权限
加日志
2.怎么实现动态代理?
首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。
序列化
1.序列化与反序列化
前提:实现serializabal接口
序列化:将对象转化为字节码存储以及传输
反序列化:将字节码文件转化为对象
注意:transient、static修饰贼不会被序列化以及反序列化。serialVersionUID如果不赋值,则在序列化的过程中程序会根据其属性生成一个serialVersionUID,但在反序列化的工程中其值是不一致的,所以在序列化与反序列化的过程中,如果不赋值serialVersionUID则会报invalidClassException
2.什么是 java 序列化?什么情况下需要序列化?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
什么情况下需要序列化:
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;