注:JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口如果想代理没有实现接口的类可以使用CGLIB包。但是本实例只讲第一种代理方式:接口代理方式;第二种代理方法:CGlib代理方法以后讲述;
java中 动态代理的作用:
1、可以在不修改源码的情况下,给方法体补充新的功能
2、动态代理可以实现降低java代码的耦合性,实现不同功能代码的分离
动态代理案例:
代码1:public interface User
package day27;
public interface User {
public abstract void add();
public abstract void delete();
}
代码2:public class UserImp implements User
package day27;
public class UserImp implements User {
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("添加用户");
}
@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("删除用户");
}
}
package day27;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
Object target;
public MyInvocationHandler(Object target) {
// TODO Auto-generated constructor stub
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("权限校验");
method.invoke(target, args);
System.out.println("日志记录");
return null;
}
}
代码4:public class UserProxy
package day27;
import java.lang.reflect.Proxy;
public class UserProxy {
public static void main(String[] args) {
UserImp user = new UserImp();
user.add();
user.delete();
System.out.println("-------------------");
MyInvocationHandler m = new MyInvocationHandler(user);
User u = (User)Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), m);
u.add();
System.out.println("----");
u.delete();
}
}
运行结果:
添加用户
删除用户
-------------------
权限校验
添加用户
日志记录
----
权限校验
删除用户
日志记录
java实现动态代理需要哪些步骤:
1、创建某一个类的接口并在接口中声明需要动态代理的抽象方法,如果在接口中没有声明的方法是不能被实现动态代理的;
2、创建一个类并实现接口
3、创建 MyInvocationHandler 类并 实现InvocationHandler 接口,在这个类中我们需要的是创建通用的动态代理的方法(这是关键);
4、创建类 调用动态代理,Proxy.newProxyInstance(loader, interfaces, h)
MyInvocationHandler m = new MyInvocationHandler(user);
User u = (User)Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), m);
在使用复合后的 User对象 u 来调用动态代理后的方法 u.add() u.delete() 等等;