参考答案
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—