JAVA后端面试《反射》

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;
/**
 * 1.接口
 */
interface Hello{
    void sayHello();
    void sayByeBye();
}

/**
 * 2.目标类:实现接口
 */
class HelloImpl implements Hello{


    @Override
    public void sayHello() {
        System.out.println("hello");
    }

    @Override
    public void sayByeBye() {
        System.out.println("ByeBye");
    }
}

/**
 * 3.代理类(可选增强剂):不实现接口
 */
class Broker{
    public static void first(){
        System.out.println("前置增强");
    }
    public static void last(){
        System.out.println("后置增强");
    }

}

/**
 * 4.动态代理类
 */
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);//method代表目标类中的任何一个方法
        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();
       /* 输出结果:
		          前置增强
				  hello
				  后置增强
				  前置增强
				  ByeBye
				  后置增强      */
    }
}
发布了18 篇原创文章 · 获赞 6 · 访问量 1860

猜你喜欢

转载自blog.csdn.net/weixin_43766298/article/details/104154889