代理模式是基础的代理模式之一。常用的AOP,日志都是代理模式现象的。在不改变原来的类或者方法的前提下,对外提供增值服务。
java 实现代理的方式
1)代理分静态代理,
2)jdk动态代理,
3)Cglib动态代理。
静态代理实现方式
代码静态代理,主要通过继承相同的接口,
java jdk 动态代理实现方式
java jdk 动态代理。主要是实现 InvocationHandler 接口即可
举个例子
package proxy;
/**
* @author ZHONGZHENG664
* @date 2018/8/31.
*/
public interface User {
void getNmae();
void getAge();
/**
* 获取工资
* @return
*/
int getSarly(int month);
}
实现类
package proxy;
/**
* @author ZHONGZHENG664
* @date 2018/8/31.
*/
public class RealUser implements User {
public void getNmae() {
System.out.println("my name is xiaoming");
}
public void getAge() {
System.out.println("my age is 14");
}
public int getSarly(int month) {
return month+200;
}
}
代理实现:增加日志
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author ZHONGZHENG664
* @date 2018/8/31.
*/
public class DynamicProxy implements InvocationHandler {
private Object user;
public DynamicProxy(Object user) {
this.user = user;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before rent house");
System.out.println("Method:" + method);
// 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
method.invoke(user, args);
// 在代理真实对象后我们也可以添加一些自己的操作
System.out.println("after rent house");
return null;
}
}
测试类:
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* @author ZHONGZHENG664
* @date 2018/8/31.
*/
public class TestProxy {
public static void main(String[] gars) {
RealUser realUser = new RealUser();
DynamicProxy dynamicProxy = new DynamicProxy(realUser);
User user = (User) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(),
realUser.getClass().getInterfaces(),
dynamicProxy);
System.out.println(user.getClass().getName());
user.getAge();
user.getNmae();
System.out.println("my sarly:"+user.getSarly(80));
}
}