您的位置:首页 > 编程语言 > Java开发

java动态代理Proxy

2016-06-22 20:29 645 查看
package com.gz_06;

public interface StudentDao {
public void login();
public void regist();
}
package com.gz_06;

public class StudentDaoImpl implements StudentDao{

@Override
public void login() {
System.out.println("登陆");
}

@Override
public void regist() {
System.out.println("注册");
}

}
package com.gz_06;

public class StudentDaoImpl2 implements StudentDao{

@Override
public void login() {
System.out.println("权限验证");
System.out.println("登陆");
System.out.println("动态代理");
}

@Override
public void regist() {
System.out.println("权限验证");
System.out.println("注册");
System.out.println("动态代理");
}

}
package com.gz_06;

public interface UserDao {
public void add();
public void delete();
public void change();
public void find();
}
package com.gz_06;

public class UserDaoImpl implements UserDao{

@Override
public void add() {
System.out.println("增加操作");
}

@Override
public void delete() {
System.out.println("删除操作");
}

@Override
public void change() {
System.out.println("修改操作");
}

@Override
public void find() {
System.out.println("查询操作");
}

}
package com.gz_06;

public class UserDaoImpl2 implements UserDao{

@Override
public void add() {
System.out.println("权限校验");
System.out.println("增加操作");
System.out.println("日志记录");
}

@Override
public void delete() {
System.out.println("权限校验");
System.out.println("删除操作");
System.out.println("日志记录");
}

@Override
public void change() {
System.out.println("权限校验");
System.out.println("修改操作");
System.out.println("日志记录");
}

@Override
public void find() {
System.out.println("权限校验");
System.out.println("查询操作");
System.out.println("日志记录");
}

}
package com.gz_06;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {
public static void main(String[] args) {
UserDao ud=new UserDaoImpl();
ud.add();
ud.delete();
ud.change();
ud.find();
System.out.println("----------");
//但是在实际开发中,一般在进行操作的时候都需要进行权限验证,操作后需要进行日志记录,怎么办呢?
//因为是一部分人需要权限校验,和日志记录,所以第一种方式是重写一个实现类
UserDao ud2=new UserDaoImpl2();
ud2.add();
ud2.delete();
ud2.change();
ud2.find();
System.out.println("--------");
//其他的类也需要权限校验,又这样做?
StudentDao stu=new StudentDaoImpl();
stu.login();
stu.regist();
System.out.println("-----");
StudentDao stu2=new StudentDaoImpl2();
stu2.login();
stu2.regist();
System.out.println("------");
//这样做太恶心了,所以我们要学会偷懒,就需要使用动态代理
/*        static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
InvocationHandler 是代理实例的调用处理程序 实现的接口。
Object invoke(Object proxy, Method method, Object[] args)     在代理实例上处理方法调用并返回结果。
*/
InvocationHandler handler=new MyInvocationHandler(ud);
UserDao proxy=(UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(), ud.getClass().getInterfaces(), handler);
proxy.add();
proxy.delete();
proxy.change();
proxy.find();

System.out.println("------");
InvocationHandler handler2=new MyInvocationHandler(stu);
StudentDao proxy2= (StudentDao) Proxy.newProxyInstance(stu.getClass().getClassLoader(), stu.getClass().getInterfaces(), handler2);
proxy2.login();
proxy2.regist();

}
}

package com.gz_06;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {
private Object target;//目标代理对象
public MyInvocationHandler(Object target){
this.target=target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("权限校验");
Object result=method.invoke(target, args);
System.out.println("日志记录");
return result;
}

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: