1.被代理类
Person.java
package com.fill.jdbc;
public class Person {
private int age;
private String name;
private String sex;
public String ss;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(int age, String name, String sex) {
super();
this.age = age;
this.name = name;
this.sex = sex;
System.out.println("有参方法");
}
private void sy(){
System.out.println("测试私有");
}
public Person(){
System.out.println("无参方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
2.接口
Subject.java
package dynamalDemo;
/*
* 要代理的主题接口
*/
public interface Subject {
public void miai();
public void paipai2();
}
3.动态代理类
DynaProxy.java
package dynamalDemo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/*
* 动态代理类
* 动态代理:即通过代理类:Proxy的代理,接口和实现类之间
* 可以不直接发生联系,而可以在运行期(Runtime)实现动态关联.
* java动态代理主要使用java.lang.reflect包中的两个类
* a.InvocationHandler类
* b.Proxy类
* *动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了
* 这些interface,而且在生成Proxy的时候,必须给他提供一个hander,让他来接管实际工作
*/
public class DynaProxy implements InvocationHandler {
private Object target;//对代理对象,表示不知道会代理什么对象
public DynaProxy(Object target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object obj=null;
before();
obj=method.invoke(target, args);//正在调用业务方法
after();
return obj;
}
private void before(){
System.out.println("为代理人匹配如意郎君");
}
private void after(){
System.out.println("本次相亲结束");
}
}
4.开始测试:
Test.java
package dynamalDemo;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p=new Person("水水");
DynaProxy dynaProxy=new DynaProxy(p);
//Proxy 提供用于动态代理类和实例的静态方法
//它还是由这些方法创建的所有动态代理类的超类
Subject s=(Subject) Proxy.newProxyInstance(p.getClass().getClassLoader(),p.getClass().getInterfaces(),dynaProxy);
s.miai();
s.paipai2();
}
}
总结:经过对比,静态代理只能代理自己继承的那个接口的其他继承者。动态代理可以代理多个对象.