Java中的java.lang.reflec包下提供了Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成动态代理对象,JDK提供的代理只能针对接口做代理。
首先定义一个接口
- package com.kxg_05;
- public interface Student {
- public void login();
- public void regist();
- }
复制代码 然后创建一个该接口的实现类
- package com.kxg_05;
- public class StudentImpl implements Student {
- public void login() {
- System.out.println("登录功能");
- }
- public void regist() {
- System.out.println("注册功能");
- }
- }
复制代码 使用Proxy类中的public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)方法创建一个代理对象。
此方法中第一参数为要代理对象的构造器,第二个参数为该对象要实现的接口列表,第三个参数为指派方法调用的调用处理程序。
第三个参数类型为InvocationHandler接口,实际需要的是实现该接口的实现类。所以继续定义一个实现了InvocationHandler接口的实现类。
- package com.kxg_05;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- public 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 {
- // 第一个参数是需要进行代理的对象,第二个参数是对象的方法,第三个参数是对象方法的参数
- // 注意:该方法的调用是底层调用,看不到
- System.out.println("权限校验");
- Object result = method.invoke(target, args);
- System.out.println("日志记录");
- return result;// 返回的就是代理对象
- }
- }
复制代码 得到此实现类以后,就可以创建新的代理对象
- package com.kxg_05;
- import java.lang.reflect.Proxy;
- public class Test {
- public static void main(String[] args) {
- // Student接口的实现类
- Student s = new StudentImpl();
- // InvocationHandler接口的实现类
- MyInvocationHandler mi = new MyInvocationHandler(s);
- // 因为是对Student接口进行动态代理,所以返回值的类型也是Student接口
- Student proxy = (Student) Proxy.newProxyInstance(s.getClass()
- .getClassLoader(), s.getClass().getInterfaces(), mi);
- // 调用方法
- proxy.login();
- proxy.regist();
- }
- }
复制代码
|
|