在多个方法中加入相同的业务逻辑时,需要动态代理
Java中的代理是针对接口的动态代理;
使用代理的步骤如下:
1,创建一个接口 person
public interface Person {
void useAex();
}
2,创建Person的实现类
public class Chinese implements Person{
public void useAex() {
// TODO Auto-generated method stub
System.out.println("hello");
}
}
3,创建并编写代理类LogProxy.java。此类实现了java提供的InvocationHandler接口。通过这个代理类,可以在运行时自动创建指定接口的代理对象,并由此代理对象完成相关业务逻辑流程。
public class LogProxy implements InvocationHandler{
//被代理的对象
private Object objProxy ;
public LogProxy(Object objProxy ){
this.objProxy =objProxy ;
}
//产生代理对象
public static Object bind(Object obj){
Class cls=obj.getClass();
//System.out.println(cls);
return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), new LogProxy(obj));
}
//代理调用目标对象方法以及提供额外操作的方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
dobefore(method);
Object object=method.invoke(objProxy , args);
doafter(method);
return object;
}
private void dobefore(Method method){
System.out.println("方法"+method.getName()+"执行前");
}
private void doafter(Method method){
System.out.println("方法"+method.getName()+"执行后");
}
}
4,创建并编写测试类TestLog.java
package com.test.proxy;
import com.tjise.DAO.Person;
import com.tjise.DAO.Impl.Chinese;
public class LogProxyTest {
public static void main(String[]args){
Person person= (Person)LogProxy.bind(new Chinese());
person.useAex();
}
}
运行结果:
方法useAex执行前
hello
方法useAex执行后