动态代理
2017-12-28 本文已影响0人
骇客与画家
代码
链接:https://pan.baidu.com/s/1ge7P1sf 密码:yqwx
Test.java Mapper
public interface Test {
void test();
int demo(int a);
void run();
}
public interface UserDao {
void insert();
void delete();
void update();
}
TestHandler.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TestHandler implements InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// method 方法被invoke给统一处理
System.out.println("Call:"+method.getName());
Class type = method.getReturnType();
if(type == int.class) {
return 8;
}
return null;
}
}
ProxyDemo.java
import java.lang.reflect.Proxy;
public class ProxyDemo {
public static void main(String[] args) {
/**
* 利用动态代理创建Test接口的实例
*
* 利用动态代理可以统一处理一组接口方法,可以
* 在不改变目标对象功能情况下为软件扩展新功能
*
*/
TestHandler handler = new TestHandler();
// new Cclass[]{} 中放的是被代理的接口
Object obj = Proxy.newProxyInstance(ProxyDemo.class.getClassLoader(),
new Class[] {Test.class,UserDao.class}, handler);
// 利用反射检查 obj 对象的具体类型
System.out.println(obj.getClass());
Test test = (Test)obj;
int n = test.demo(5);
System.out.println(n);
test.test();
test.run();
UserDao dao = (UserDao)obj;
dao.insert();
dao.delete();
dao.update();
}
}
1.png
2.png
3.png