参考答案
JDK实现动态代理(真实应用案例)
实例:
- package com.lijie;
- //接口
- public interface UserDao {
- void save();
- }
- package com.lijie;
- //接口实现类
- public class UserDaoImpl implements UserDao {
- public void save() {
- System.out.println("保存数据方法");
- }
- }
下面是代理类,可重复使用,不像静态代理那样要自己重复编写代理。
- package com.lijie;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- // 每次生成动态代理类对象时,实现了InvocationHandler接口的调用处理器对象
- public class InvocationHandlerImpl implements InvocationHandler {
- // 这其实业务实现类对象,用来调用具体的业务方法
- private Object target;
- // 通过构造函数传入目标对象
- public InvocationHandlerImpl(Object target) {
- this.target = target;
- }
- //动态代理实际运行的代理方法
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("调用开始处理");
- //下面invoke()方法是以反射的方式来创建对象,第一个参数是要创建的对象,第二个是构成方法的参数,由第二个参数来决定创建对象使用哪个构造方法
- Object result = method.invoke(target, args);
- System.out.println("调用结束处理");
- return result;
- }
- }
利用动态代理使用代理方法。
- package com.lijie;
- import java.lang.reflect.Proxy;
- public class Test {
- public static void main(String[] args) {
- // 被代理对象
- UserDao userDaoImpl = new UserDaoImpl();
- InvocationHandlerImpl invocationHandlerImpl = new InvocationHandlerImpl(userDaoImpl);
- //类加载器
- ClassLoader loader = userDaoImpl.getClass().getClassLoader();
- Class<?>[] interfaces = userDaoImpl.getClass().getInterfaces();
- // 主要装载器、一组接口及调用处理动态代理实例
- UserDao newProxyInstance = (UserDao) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);
- newProxyInstance.save();
- }
- }
- 缺点:必须是面向接口,目标业务类必须实现接口。
- 优点:不用关心代理类,只需要在运行阶段才指定代理哪一个对象。
以上,是Java面试题【 JDK实现动态代理(真实应用案例)】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—