Person接口:
public interface Person{
void thinking();
}
Student类实现Person接口,该类是要被代理的类:
public class Student implements Person{
@Override
public void thinking(){
System.out.println("Thinking in stduent!");
}
}
代理类MyInvocationHandler 实现(必须实现InvocationHandler接口 ):
public class MyInvocationHandler implements InvocationHandler{
private Object object;
public MyInvocationHandler(Object object){ this.object = object; }
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//通过反射调用被代理类的方法
method.invoke(object, args);
return null;
}
}
测试:
public class Test{
public static void main(String [] args){
//需要先有一个被代理的类
Student s = new Student();
//创建代理类
InvocationHandler handler = new MyInvocationHandler(s);
//获得代理类的类加载器
ClassLoder classLoder = handler.getClass().getClassLoader();
//获得被代理类实现的接口
Class<?>[] interfaces = s.getClass().getInterfaces();
//生成代理对象
Person proxy = (Person)Proxy.newProxyInstance(classLoder,interfaces,handler);
//通过代理对象调用被代理类的方法
proxy.thinking();
}
}
Person接口和Student类无需过多解释。
代理类必须实现InvocationHandler接口
代理类内部通过反射调用被代理类的方法 ,method.invoke(object, args)方法涉及到反射知识
1、首先我们需要有一个被代理的对象
2、然后通过Proxy类的静态方法newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)生成代理类,三个参数分别解释一下:
3、最后就可以通过生成的代理对象调用相应被代理对象的方法了