代理类是Proxy。
然后我们要实现类似于切面就是说在已确定实现类的情况下在某方法里面加入更多的东西(不修改原来的东西,仅拿到的对象有修改)。
主角方法:
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
第一个参数就是当前main方法所在类的类加载器ClassLoader. 第二个就是某类的接口的class属性。第三个参数我们需要创建这个接口的实现类,实现它的invoke方法。
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
然后里面的method有个invoke(Object obj,Object[] args)方法,我们一定要执行到这个方法,也就是调用对象的方法。然后在前面和后面分别写逻辑代码,就像切面一样。
要注意 newProxyInstance返回的对象就是接口的对象。然后我们传入InvocationHandler h对象的时候,要有构造方法,要把某接口的实现类传入。
在 InvocationHandler的实现类里面我们要创建有参构造方法,传入接口对象.
public Object invoke(Object proxy, Method method, Object[] args)
这个方法的返回值是Object obj=method.invoke(?,?);
总结代码:
public interface UserDAO {
public void add();
public void update();
}
public class UserDAOimpl implements UserDAO {
@Override
public void add() {
System.out.println("现在正在执行add方法。。。");
}
@Override
public void update() {
System.out.println("现在正在执行update方法。。。");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
UserDAO userDAO=new UserDAOimpl();
Class[] classes={UserDAO.class};
userDAO=(UserDAO) Proxy.newProxyInstance(Main.class.getClassLoader(),classes,new inno(userDAO));
userDAO.add();
}
}
class inno implements InvocationHandler{
Object object;
public inno(Object obj) {
this.object=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("现在正在执行代理了");
Object obj=method.invoke(object ,args);
System.out.println("代理执行结束!");
return obj;
}
}