为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
public interface GiveGift {
publicvoid GiveDolls();
publicvoid GiveFlowers();
publicvoid GiveChocolate();
}
Jack真实对象
public class Jack implements GiveGift{
Girl girl;
public Jack(Girl girl){
this.girl = girl;
}
@Override
publicvoid GiveDolls() {
System.out.println("给"+girl.getGrade()+"的"+girl.getName()+"送洋娃娃");
}
@Override
publicvoid GiveFlowers() {
System.out.println("给"+girl.getGrade()+"的"+girl.getName()+"送花");
}
@Override
publicvoid GiveChocolate() {
System.out.println("给"+girl.getGrade()+"的"+girl.getName()+"送巧克力");
}
}
代理
public class Proxy implements GiveGift{
Jack jack;
public Proxy(Girl girl){
jack = new Jack(girl);
}
@Override
public void GiveDolls() {
//还可以添加其它操作
jack.GiveDolls();
}
@Override
public void GiveFlowers() {
//还可以添加其它操作
jack.GiveFlowers();
}
@Override
public void GiveChocolate() {
//还可以添加其它操作
jack.GiveChocolate();
}
//还可以提供更多的方法,比如花和巧克力一起送
}
publicclass Girl {
private String name;
private String grade;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public String getGrade() {
returngrade;
}
publicvoid setGrade(String grade) {
this.grade = grade;
}
}
publicclass Test {
publicstaticvoid main(String[]args){
Girl girl = new Girl();
girl.setGrade("高二三班");
girl.setName("小红红");
Proxy proxy = new Proxy(girl);
proxy.GiveChocolate();
proxy.GiveDolls();
proxy.GiveFlowers();
}
}
动态代理(利用Java反射机制)
package com.dao;
public interface StudentDao {
publicvoid saveStudent(String name,intage);
public String queryStudent();
}
2、学生实现类
package com.dao.impl;
import com.dao.StudentDao;
publicclass StudentDaoImpl implements StudentDao{
@Override
publicvoid saveStudent(String name,int age){
System.out.println("保存学生:name:"+name+",age:"+age);
}
@Override
public String queryStudent() {
System.out.println("查询学生...");
return"查询结果";
}
}
3、代理类
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//1、实现InvocationHandler接口
publicclass DAOProxy implements InvocationHandler{
privateObjectoriginalObject;
publicObject bind(Object obj){
this.originalObject = obj;
//2、返回代理实例,newProxyInstance是Proxy类的一个静态方法,参数分别是:实现类的类加载器、实现类的接口类、InvocationHandler对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), this);
}
@Override
//3、实现invoke方法(执行任何一个被代理的实体类方法都会默认自动调用invoke方法)
publicObject invoke(Object proxy, Method method, Object[] param) throws Throwable {
Object result = null;
System.out.println("调用实现类方法之前所做的操作....");
result = method.invoke(this.originalObject, param);
System.out.println("调用实现类方法之后所做的操作....");
return result;
}
}
说明:
1、method.invoke(this.originalObject, param):
4、测试:
package com.main;
import com.dao.StudentDao;
import com.dao.impl.StudentDaoImpl;
import com.proxy.DAOProxy;
publicclass Main {
publicstaticvoid main(String[]args){
StudentDao sDao = new StudentDaoImpl();
DAOProxy proxy = new DAOProxy();
//proxy.bind()返回了一个代理实例
sDao = (StudentDao)proxy.bind(sDao);
sDao.saveStudent("吴帝永",27);
String result = (String)sDao.queryStudent();
System.out.println(result);
}
}
动态代理(利用cglib)
package com.dao;
public abstract class StudentDao {
public abstract void saveStudent(String name,int age);
public abstract String queryStudent();
}
package com.dao.impl;
import com.dao.StudentDao;
publicclass StudentDaoImpl extends StudentDao {
@Override
publicvoid saveStudent(String name, int age) {
System.out.println("保存学生:name:" + name + ",age:" + age);
}
@Override
public String queryStudent() {
System.out.println("查询学生...");
return"查询结果";
}
}
package com.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//1、实现MethodInterceptor接口
publicclass DAOCglibProxy implements MethodInterceptor{
private Object originalObject;//好像用不上哦
public Object bind(Object obj){
this.originalObject = obj;
Enhancer enhancer = new Enhancer();
//2、设置父类
enhancer.setSuperclass(obj.getClass());
//3、设置回调函数
enhancer.setCallback(this);
return enhancer.create();
}
@Override
//4、重写拦截器
public Object intercept(Object obj, Method method, Object[] params,MethodProxy proxy) throws Throwable {
Object object = null;
System.out.println("调用之前....");
object = proxy.invokeSuper(obj, params);
System.out.println("调用之后....");
return object;
}
}