java的代理有静态代理和动态代理两种,动态代理是使用了java的反射机制进行动态的生产代理对象。
接口
package com.llh.proxy;
public interface IHello {
public void sayHollo();
}
实现类
package com.llh.proxy;
public class HelloImp implements IHello {
@Override
public void sayHollo() {
System.out.println("hello!");
}
}
静态代理
代理对象和本代理对象实现同一个接口
public class HelloProxy implements IHello{
IHello proxy;
public HelloProxy(IHello hello) {
this.proxy = hello;
}
@Override
public void sayHollo() {
System.out.println("调用前...");
proxy.sayHollo();
System.out.println("调用后...");
}
public static void main(String[] args) {
//被代理对象
IHello hello = new HelloImp();
//代理对象
HelloProxy proxy = new HelloProxy(hello);
//调用代理对象方法
proxy.sayHollo();
//输出结果
//调用前...
//hello!
//调用后...
}
}
动态代理
使用java的标准的动态代理可以动态创建我们需要的代理对象,无需自己实现创建和被代理对象同一个接口(IHello)的代理类,使用动态代理可以动态生成我们需要的代理对象,这个比静态代理更加灵活。
package com.llh.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理测试
* @author victor
*/
public class ProxyTest {
public static void main(String[] args) {
//需要被代理的对象
IHello hello = new HelloImp();
//代理处理
InvocationHandler helloProxy = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//TODO 逻辑处理,如日志
System.out.println("调用方法前....");
//调用被代理的对象方法
Object obj = method.invoke(hello, args);
//TODO 逻辑处理,如日志
System.out.println("调用方法后....");
return obj;
}
};
//返回代理对象
IHello proxy = (IHello) Proxy.newProxyInstance(ProxyTest.class.getClassLoader(),new Class<?>[]{IHello.class},helloProxy);
//调用代理方法
proxy.sayHollo();
//打印结果
//调用方法前....
//hello!
//调用方法后....
}
}