动态代理:
** 创建代理类:**
1. 创建代理类,此类需要实现InvocationHandler接口
2. 接口中有一个invoke方法
3. 在代理类中声明一个Object对象,使用构造方法对其进行初始话
4. invoke方法有三个参数:
在此方法中利用反射,执行Object对象的method方法,并在其前后进行增强
** 动态代理类的使用:**
1.new一个被代理类对象转型成接口
2.将代理类对象作为代理类构造函数参数构造代理类
3.调用Proxy.newProxyInstance:
依次传入:代理类的构造器,被代理对象接口,代理类对象
返回一个Object对象
4.将返回来的对象强转为被代理类的接口即完成了被代理类的增强
5.调用对象方法查看结果。。。
- 代理类:
public class ProxyHandler implements InvocationHandler {
Object obj = null;
public ProxyHandler(Object obj) {
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = method.invoke(obj, args);
System.out.println("这是用来增强原来方法额的逻辑代码。。。");
return object;
}
}
- 被代理接口:
public interface DeleteByEmpnoSer {
public String del(int emp,String s);
}
- 被代理接口实现类:
public class DeleteByEmpnoService implements DeleteByEmpnoSer{
@Override
public String del(int emp, String s) {
System.out.println("这是原方法的输出:"+emp+","+s);
return "返回值:"+s+","+emp;
}
}
- 动态代理的使用:
public class Test {
public static void main(String[] args) {
DeleteByEmpnoSer dbes = new DeleteByEmpnoService();
ProxyHandler handler = new ProxyHandler(dbes);
Object npi = Proxy.newProxyInstance(ProxyHandler.class.getClassLoader(), dbes.getClass().getInterfaces(), handler);
DeleteByEmpnoSer dbe=(DeleteByEmpnoSer)npi;
dbe.del(1, "s");
}
}