0
点赞
收藏
分享

微信扫一扫

代理:静态代理,动态代理(jdk动态代理,cglib动态代理)

GG_lyf 2022-03-18 阅读 89
代理模式

1.什么是代理模式?

2.java中什么是静态代理?

3.什么是动态代理?

4. 动态代理的分类

5.jdk动态代理的实现步骤

6.jdk动态代理的例子

//1.创建接口,定义目标类需要完成的功能
public interface People {
void sayHello();
void sayGoodBye();
}
//2.创建接口的实现类,及目标类,实现接口中的方法
public class PeopleImpl implements People {
@Override
public void sayHello() {
System.out.println("hello!!!!!!");
}

@Override
public void sayGoodBye() {
System.out.println("saygood!!!!!!");
}

//这个方法没用
public void sayNihao(){
System.out.println("nihao");
}
}
//3.实现InvocationHandler接口,在invoke方法中完成代理类的功能。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class InvocationHandlerImp implements InvocationHandler {
private People people;
InvocationHandlerImp(People people){
this.people=people;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理开始");
method.invoke(people, args);
System.out.println("增强功能");
return null;
}
}
import java.lang.reflect.Proxy;

public class main {
public static void main(String[] args) {
People o1=(People)Proxy.newProxyInstance(PeopleImpl.class.getClassLoader(),
PeopleImpl.class.getInterfaces(), new InvocationHandlerImp(new PeopleImpl()));
o1.sayHello();
o1.sayGoodBye();
}
}

 从运行结果可以看到我们不但完成了目标方法的调用还能进行功能增强。

7.如果我们把main函数中创建代理类对象的语句改变一下

//People o1=(People)Proxy.newProxyInstance(PeopleImpl.class.getClassLoader(), PeopleImpl.class.getInterfaces(), new InvocationHandlerImp(new PeopleImpl()));


People o1=(PeopleImp)Proxy.newProxyInstance(PeopleImpl.class.getClassLoader(), PeopleImpl.class.getInterfaces(), new InvocationHandlerImp(new PeopleImpl()));

 我们将得到的Object类的代理对象强转成目标类,此时会发生什么?

 为什么不能转为PeopleImple类型,而能转成People类型呢????

这里我拿一个网上的例子说明,tagService是我们定义的接口。目标类实现这个接口。printSomeThing(String paramString)是我们定义给目标类的功能。

我们将jdk动态代理为我们创建的代理对类反编译得出:

 8.演示第五条结论

//创建目标类2,实现功能
public class PeopleImpl2 implements People {
@Override
public void sayHello() {
System.out.println("你好");
}

@Override
public void sayGoodBye() {
System.out.println("再见");
}
}

 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class main {
public static void main(String[] args) {
PeopleImpl2 people2 = new PeopleImpl2();
People o1=(People)Proxy.newProxyInstance(PeopleImpl.class.getClassLoader(),
PeopleImpl.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理 开始");
//people是PeopleImpl2类的对象
method.invoke(people2,args);
System.out.println("功能 增强");
return null;
}
});
o1.sayHello();
o1.sayGoodBye();
}
}
举报

相关推荐

0 条评论