动态代理只对接口有效!!!
示例接口:
public interface Student {
void login ();
void submit ();
}
示例接口的实现类:
public class StudentImp implements Student {
@Override
public void login () {
System.out.println ("登录了,");
}
@Override
public void submit () {
System.out.println ("提交了");
}
}
要点:
定义实现自己的InvocationHandler类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* Created by Void Young on 5:15 PM 7/26/2016 .
* IDEA-Test .
* 对于這里的运行机制,还未理解,
* 比如method对象是怎么获取到的?
* args参数又是从哪里传入?
*/
public class MyInvocationHandler implements InvocationHandler {
Object target;
public MyInvocationHandler (Object target) {
this.target = target;//要被代理的对象
}
@Override
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
System.out.println ("来呀,互相伤害呀");//此处为被代理方法运行前 要添加实现的内容
method.invoke (target, args); //执行被代理的target的方法method ,不定长参数args是该方法是实参
System.out.println ("我艹");//此处为被代理方法运行后 要添加实现的内容
return null;
}
}
测试类:
import java.lang.reflect.Proxy;
/**
* Created by Void Young on 5:19 PM 7/26/2016 .
* IDEA-Test .
*/
public class TestDTDL {
public static void main (String[] args) {
StudentImp si = new StudentImp ();
si.login ();
si.submit ();
System.out.println ("------华丽的分割线---------");
MyInvocationHandler mih = new MyInvocationHandler (si);//new一个自己的InvocationHandler
Student s =// 只支持接口用接口的实例接收结果
(Student)//结果需要强转类型
Proxy.newProxyInstance (
si.getClass ().getClassLoader (), //传入代理对象的classloader
si.getClass ().getInterfaces (), // 代理对象的接口类
mih);//自定义的InvocationHandler
s.login ();
s.submit ();
}
}
运行实例: