java静态代理就是在编译时就将接口、实现类、代理类一股脑儿全部手动完成。
package com;
public interface User {
public void login() ;
}
package com;
public class UserImpl implements User {
@Override
public void login() {
System.out.println("该方法调用前 ");
System.out.println("登录");
System.out.println("该方法调用后 ");
}
}
package com;
public class Test {
public static void main(String[] args) {
UserImpl ui = new UserImpl();
ui.login();
}
}
java动态代理可以在程序运行期间根据需要动态的创建代理类及其实例,来完成具体的功能。
package com;
public interface User {
public void login() ;
}
package com;
public class UserImpl implements User {
@Override
public void login() {
System.out.println("登录");
}
}
package com;
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("该方法调用前 ");
method.invoke(target, args);//执行被代理对象的方法
System.out.println("该方法调用后 ");
return null;
}
}
package com;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
UserImpl ui = new UserImpl();
MyInvocationHandler h = new MyInvocationHandler(ui);
User u = (User)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), h);
u.login();
}
}