原理
- 在程序的执行过程中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类
作用
- 访问控制,在代理中,控制是否可以调用目标对象的方法
- 功能增强,可以完成在目标对象的调用是增加额外的功能
- 可以随时给不同的目标创建代理类
实现步骤
1 创建接口,定义目标类要完成的功能
public interface HelloService {
void sayHello();
}
2 创建目标类实现接口
public class HelloImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("Hello");
}
}
3 创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
public class MyInvokerHandler implements InvocationHandler {
private Object target;
/**
* 传入目标对象,对其创建代理对象
* @param target
*/
public MyInvokerHandler(Object target) {
this.target = target;
}
/**
* invoke()代理类需要完成的功能
*
* @param proxy jdk创建的代理对象,
* @param method 目标类中的方法
* @param args 目标类中方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//使用反射机制调用某个方法
//Method 表示方法
Object result = method.invoke(target, args);
return result;
}
}
4 使用Proxy类的静态方法,创建代理对象,并把返回值转为接口类型
public class InvokerHandlerTest {
public static void main(String[] args) {
HelloService helloService = new HelloImpl();
MyInvokerHandler invokerHandler = new MyInvokerHandler(helloService);
HelloService proxy = (HelloService) Proxy.newProxyInstance(helloService.getClass().getClassLoader(), helloService.getClass().getInterfaces(), invokerHandler);
proxy.sayHello();
}
}
test
Hello
Process finished with exit code 0
来源:oschina
链接:https://my.oschina.net/u/3943508/blog/4927424