动态代理与静态代理的代码区别 : 动态代理实现了代理类的创建,但是接口和代理对象还是需要(具体区别暂不赘述)
实现示例:
1. Marry接口
public interface Marry {
public void marry();
}
2. 代理对象People
public class People implements Marry{
private String name;
public People(){}
public People(String name){
this.name=name;
}
@Override
public void marry() {
System.out.println(name+"好好的Marry");
}
}
3. 动态代理类MyProxy
- 类似静态代理,通过set方法或其他方法注入代理对象
- 自写get方法,以得到创建的代理类
- 重写invoke方法,类似代理类执行代理过程
public class MyProxy implements InvocationHandler {
public Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy(){
return Proxy.newProxyInstance(
this.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+"代理开始");
Object result = method.invoke(target, args);
System.out.println("返回了"+method.getReturnType()+"类型的结果,"+method.getName()+"代理结束");
return result;
}
}
4. 测试代理
public class Test {
public static void main(String[] args) {
MyProxy myProxy = new MyProxy();
myProxy.setTarget(new People("小明"));
Marry proxy = (Marry)myProxy.getProxy();
proxy.marry();
}
}
5. 执行结果
marry代理开始
小明好好的Marry
返回了void类型的结果,marry代理结束