由于java动态代理只能代理接口,因此,我需要先定义被代理对象的接口。
interface Hello{
void print();
}
然后定义实现类
class HelloImp implements Hello{
public void print(){
System.out.println("你好呀");
}
}
我们需要定义一个类对被代理对象方法调用后进行处理。这个类需要实现InvocationHandler
这个类需要重写invoke方法
class InvoImp<T> implements InvocationHandler
public Object invoke(Object proxy, Method method, Object[] args)
被代理对象调用方法前会先调用invoke方法
InvoImp方法需要绑定被代理对象,以便invoke方法进行调用
//绑定被代理的对象
this.proxyobj = obj;
//返回代理对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
具体实现
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class test {
public static void main(String[] args) {
HelloImp hello = new HelloImp();
InvoImp invoImp = new InvoImp();
Hello helloproxy = (Hello) invoImp.bind(hello);
helloproxy.print("你好");
}
}
class InvoImp<T> implements InvocationHandler{
Object proxyobj;
public Object bind(T obj){
//绑定被代理的对象
this.proxyobj = obj;
//返回代理对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
/**
*
* @param proxy 被代理的对象
* @param method 调用的方法
* @param args 方法参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//利用反射通过方法名对方法进行调用
method.invoke(proxyobj,args);
System.out.println("代理输出");
return proxy;
}
}
class HelloImp implements Hello{
public void print(String content){
System.out.println("你好呀" + content);
}
}
interface Hello{
void print(String content);
}
实现效果