实现步骤
- 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法。
- 创建被代理的类和接口
- 通过 Proxy 的静态方法 newProxyInsatance(ClassLoader loader,Class[] interfaces,InvocationHandler,handler) 来创建一个代理
- 通过代理来调用方法
代码实现:
1:
package com.lanqiao.demo2;
/**
* 接口
* @author Administrator
*
*/
public interface MyInterface {
void eat();
}
2:
package com.lanqiao.demo2;
/**
* 真实类(目标类)
* @author Administrator
*
*/
public class Human implements MyInterface{
@Override
public void eat() {
System.out.println("正在吃饭......");
}
}
3:
package com.lanqiao.demo2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 工厂类(生成代理类)
* @author Administrator
*
*/
public class ProxyFactory implements InvocationHandler{
//目标对象
private Object obj;
//定义方法,获取目标对象的代理类
public Object getTarget(Object obj) {
/**
* loader:获取目标对象的类
* interfaces:获取目标对象的所有接口
* h:代理类
*/
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
//动态执行目标对象方法的调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("此处可以扩展额外的业务功能");
//obj:代表是目标对象
Object result = method.invoke(obj, args);
return result;
}
}
4:
package com.lanqiao.demo2;
public class Test1 {
public static void main(String[] args) {
//定义目标对象
MyInterface target = new Human();
//定义工厂对象
ProxyFactory proxyHuman = new ProxyFactory();
//定义代理类对象
MyInterface proxyObject = (MyInterface) proxyHuman.getTarget(target);
proxyObject.eat();
}
}