java动态代理Proxy

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;
} }
上一篇:bayer, yuv, RGB转换方法


下一篇:使用Maven构建javaWeb项目时,启动tomcat出错:严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException: org.springframework.web.conte