静态代理
public interface Singer {
void singing();
int dance();
}
//实体类
class Cai implements Singer {
@Override
public void singing() {
System.out.println("cai 唱歌");
}
@Override
public int dance() {
System.out.println("tiaowu");
return 0;
}
}
//代理类
public class Caidaili implements Singer{
private Singer cai = new Cai();
@Override
public void singing() {
System.out.println("先收钱");
cai.singing();
}
@Override
public int dance() {
System.out.println("先收钱");
cai.dance();
return 0;
}
}
public class Main {
public static void main(String[] args) {
Singer singer = new Caidaili();
singer.singing();
singer.dance();
}
}
JDK动态代理
public interface Singer {
void singing();
int dance();
}
//实体类
class Cai implements Singer {
@Override
public void dance() {
System.out.println("Cai 在跳舞");
}
@Override
public int singing() {
System.out.println("Cai 在唱歌");
return 0;
}
}
//动态代理类
class Ruler implements InvocationHandler{
private Singer s;
public Ruler(Singer s) {
this.s = s;
}
@Override
public Object invoke(Object p, Method method, Object[] args) throws Throwable {
// System.out.println(p.getClass().toString());
System.out.println("先收钱");
Object returnVal = method.invoke(s, args);
System.out.println("asdfasdf");
return returnVal;
}
}
public class Test {
public static void main(String[] args) {
Cai cai =new Cai();
Ruler ruler = new Ruler(cai);
//构建了 以原被代理类为基准的代理类的一个对象
// o 已经等同于 Student s = new Student(); 这个s了
Object o = Proxy.newProxyInstance(Cai.class.getClassLoader(), new Class[]{Singer.class}, ruler);
System.err.println(o.getClass().toString());
if(o instanceof Singer){
Singer singer = (Singer)o;
singer.dance();
singer.singing();
singer.toString();
}
}
}
Cglib动态代理
//实体类
class Target {
public void method1() {
System.out.println("method1 running ...");
}
public void method2() {
System.out.println("method2 running ...");
}
public int method3(Integer i) {
System.out.println("method3 running ...");
return i;
}
}
//代理类
class TargetProxy {
public static <T> Object getProxy(T t) {
Enhancer en = new Enhancer(); //帮我们生成代理对象
en.setSuperclass(t.getClass());//设置要代理的目标类
en.setCallback(new MethodInterceptor() {//代理要做什么
@Override
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("执行方法前。。。");
//调用原有方法
Object invoke = methodProxy.invokeSuper(object, args);
// Object invoke = method.invoke(t, args);// 作用等同与上面。
System.out.println("执行方法后。。。");
return invoke;
}
});
return en.create();
}
}
public class Test {
public static void main(String[] args) {
Target target = (Target) TargetProxy.getProxy(new Target());
System.out.println(target.getClass().getName());
target.method1();
print(target);
}
}