import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyMain {
public static void main(String[] args) {
UserDao userDao =(UserDao) new MyInvocationHandler().getInstance(new UserDaoImpl());
userDao.getValue(1,2);
}
}
JDK 动态代理必须实现的接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
Object target;
public Object getInstance(Object target){
this.target = target;
Class<?> clazz = target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object object = method.invoke(target,args);
after();
return object;
}
private void before() {
System.out.println("before");
}
private void after() {
System.out.println("after");
}
}
Proxy.newProxyInstance比较好的写法是写在接口实现类里,这样测试JDK代理比较干净,整洁。
public interface UserDao {
public int getValue(int a, int b);
}
public class UserDaoImpl implements UserDao {
@Override
public int getValue(int a, int b) {
System.out.println("a+b="+a+b);
return a+b;
}
}
UserDao userDao =(UserDao) new MyInvocationHandler().getInstance(new UserDaoImpl());最后测试类比较简单,明了。
- UserDao 接口
- new UserDaoImpl() JDK接口加强类