底层原理:
1.创建接口
package test;
//1.创建接口,定义方法
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
2.被代理类实现接口
package test;
//2.被代理类,实现接口
public class UserDaoImpl implements UserDao{
@Override
public int add(int a, int b) {
System.out.println("add方法执行l......");
return a+b;
}
@Override
public String update(String id) {
System.out.println("update方法执行l......");
return id;
}
}
3.代理类实现动态代理
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类代理对象
Class[] interfaces={UserDao.class};
//内部类实现
/* Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
})*/
UserDaoImpl userDao=new UserDaoImpl();
//UserDaoProxy类中,需要接受一个被代理类对象
Object obj=Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));
//newProxyInstance方法返回Object类型
UserDao dao=(UserDao) obj;
int result=dao.add(1,2);
System.out.println("result:"+result);
}
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler{
private Object obj;//实现了接口的被代理类的对象的声明
//1.给被代理的对象实例化2.返回一个代理类的对象
public UserDaoProxy(Object obj) {//一般使用有参构造
this.obj = obj;
}
//增强逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前
System.out.println("方法之前执行...."+method.getName()+" :传递的参数..."+ Arrays.toString(args));
//被增强的方法执行
Object res=method.invoke(obj,args);
//方法之后
System.out.println("方法之后执行...."+obj);
return res;
}
}
运行结果如图:
具体可参照[Java]静态代理、动态代理、AOP编程代码实例:仅仅是形式上发生了变化
https://blog.csdn.net/mmmm0584/article/details/114667324