老规矩 直接贴代码
package com.Proxy;
public interface I_dao {
public void add();
}
package com.Proxy;
public class Dao_Impl implements I_dao {
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("执行添加方法");
}
}
package com.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Dao_implProxy implements InvocationHandler{
private Object object;
public Dao_implProxy() {
}
public Dao_implProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
//调用之前
doBefore();
//调用原始对象的方法
result=method.invoke(object, args);
//调用之后
doAfter();
return result;
}
private void doBefore(){
System.out.println("before method invoke");
}
private void doAfter(){
System.out.println("after method invoke");
}
}
package com.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
/**
* @description 好处:对任意的类,接口,进行任意代理,代理可叠加 ,缺点:要实现动态代理必须得实现接口
*/
public static void main(String[] args) {
I_dao helloWorld=new Dao_Impl();//父类引用指向子类对象 (向上转型同时拥有更强大的属性),动态方法调用
InvocationHandler handler=new Dao_implProxy(helloWorld);
//创建动态代理对象
I_dao proxy=(I_dao)Proxy.newProxyInstance(
helloWorld.getClass().getClassLoader(),
helloWorld.getClass().getInterfaces(),
handler);
proxy.add();
}
}