黑马程序员技术交流社区
标题:
【记录】代码练习-反射的动态代理
[打印本页]
作者:
Kevin.Kang
时间:
2015-8-12 19:32
标题:
【记录】代码练习-反射的动态代理
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();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2