1.区别:
静态代理:需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类
动态代理:利用API,在JVM内存中动态的构建Proxy对象。只是相对于静态代理做了优化
2.代码练习:
静态代理:
package cn.zwl.problem;
interface Connection{
void givePhone();
void myPhone();
}
class Daughter implements Connection{
private String phone="1822356874556";
@Override
public void givePhone() {
// TODO Auto-generated method stub
System.out.println("问我老妈同意不");
}
public void myPhone() {
System.out.println(this.phone);
}
}
class MotherProx implements Connection{
Connection target;
public MotherProx(Connection target) {
this.target = target;
}
public void myPhone() {
;
}
@Override
public void givePhone() {
// TODO Auto-generated method stub
target.givePhone();//操作女儿的联系方式
System.out.println("同意同意");
target.myPhone();
}
}
public class ProxLearn {
public static void main(String[] args) {
Daughter target=new Daughter();
MotherProx ma=new MotherProx(target);
ma.givePhone();
}
}
动态代理:
package cn.zwl.problem;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
*
* 动态代理的学习
* @author dell
*
*/
interface Connection1{
void givePhone();
void myPhone();
}
class Daughter1 implements Connection{
private String phone="1822356874556";
@Override
public void givePhone() {
// TODO Auto-generated method stub
System.out.println("问我老妈同意不");
}
public void myPhone() {
System.out.println(this.phone);
}
}
//动态代理类
class ProxyFactory{
//维护一个目标对象
private Object target;
public ProxyFactory(Object target){
this.target=target;
}
//给目标对象生成代理对象
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("可以留个联系方式吗?");
//执行目标对象方法
Object returnValue = method.invoke(target, args);
System.out.println("微信上聊!");
return returnValue;
}
}
);
}
}
public class ProxLearn2 {
public static void main(String[] args) {
// 目标对象
Connection target = new Daughter1();
// 原始的类型
System.out.println(target.getClass());
// 给目标对象,创建代理对象
Connection proxy = (Connection) new ProxyFactory(target).getProxyInstance();
// class $Proxy0 内存中动态生成的代理对象
System.out.println(proxy.getClass());
// 执行方法 【代理对象】
proxy.givePhone();
proxy.myPhone();
}
}