1.什么是java反射?
- java反射是指程序在运行期间,对于任意一个类,都可以动态获取该类的属性和方法;对于任意一个对象,都可以调用它的属性和方法。
2.什么是Java序列化和反序列化?什么情况下需要序列化?
- Java序列化:就是指把Java对象转换为字节序列的过程(方便保存或传输)。
- Java反序列化:就是指把字节序列恢复为Java对象的过程。
- 以下三种情况需要序列化:
- 当你想把内存中的对象状态保存到一个文件中或者数据库中的时候;
- 当你想用套接字在网络上传送对象的时候。
- 当你想通过RMI(Remote Method Invocation:不同虚拟机上的远程方法调用)传输对象的时候。
3.动态代理是什么?有哪些应用场景?
- 动态代理:当想要给实现了某个接口的类中的方法,加一些额外的处理,这时就可以给这个类创建一个代理,对目标类进行增强。
- Java中实现动态的方式:JDK中的动态代理和java类库的CGLib。
- 应用场景如下:
* Spring的AOP
* 加事务
* 加权限
* 加日志
4.怎么实现动态代理?
- ①首先要有1个接口,1个目标类,1个代理类,1个动态代理类。
- ②目标类实现接口,代理类不实现接口。
- ③代理类可以理解为可选增强剂,目的是增强目标类中的方法。
- ④动态代理类实现InvocationHandler接口,重写invoke方法,在方法体中调用代理类对目标类方法进行增强。
- ⑤动态代理类中对外提供方法获取增强后的目标类,其实就是Proxy调用newProxyInstance(…)静态方法。
- ⑥在测试的时候要把获取到的增强目标类强转为接口。
package com.springCloud.consumer.controller;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Hello{
void sayHello();
void sayByeBye();
}
class HelloImpl implements Hello{
@Override
public void sayHello() {
System.out.println("hello");
}
@Override
public void sayByeBye() {
System.out.println("ByeBye");
}
}
class Broker{
public static void first(){
System.out.println("前置增强");
}
public static void last(){
System.out.println("后置增强");
}
}
class MyInvocationHandler implements InvocationHandler{
private Object target;
public MyInvocationHandler(Object target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Broker.first();
Object result = method.invoke(target,args);
Broker.last();
return result;
}
public Object getInstance() {
Class<?> aClass = this.target.getClass();
return Proxy.newProxyInstance(aClass.getClassLoader(),aClass.getInterfaces(),this);
}
}
public class DynamicProxyDemo {
public static void main(String[] args) {
HelloImpl impl =new HelloImpl();
MyInvocationHandler handler=new MyInvocationHandler(impl);
Hello instance = (Hello) handler.getInstance();
instance.sayHello();
instance.sayByeBye();
}
}