JDK动态代理:对实现了接口的类生成代理
首先有一个接口UserDao
package com.shyleo.demo1;
public interface UserDao {
public void add();
public void delete();
}
实现类UserDaoImpl
package com.shyleo.demo1;
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("添加用户..");
}
@Override
public void delete() {
System.out.println("删除用户..");
}
}
JDKProxy动态代理类
package com.shyleo.demo1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler{
public JDKProxy(){
}
getprivate Object target;
public JDKProxy(Object target){
this.target=target;
}
public UserDao createProxy(){
System.out.println("createProxy方法..");
UserDao proxy=(UserDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("invoke方法....");
if("add".equals(method.getName())){
System.out.println("===添加日志==="); //增强的代码
// Object result=method.invoke(userDao, args); //result是方法的返回值,在这里method.invoke(userDao, args);就是调用add方法,result就是add方法的返回值
Object result=method.invoke(target, args); //result是方法的返回值,在这里method.invoke(userDao, args);就是调用add方法,result就是add方法的返回值
return result;
}
// return method.invoke(userDao, args);
return method.invoke(target, args);
}
}
测试代码:
@Test
public void test2(){
// 被代理对象
UserDao userDao=new UserDaoImpl();
// 创建代理对象的时候传入被代理对象.
UserDao proxy=new JDKProxy(userDao).createProxy();
proxy.add();
proxy.delete();
}