JAVA-动态代理和AOP

105 阅读1分钟
package Demo.java3.动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.regex.Pattern;

/*
动态代理

 */
interface Jiekou   //代理接口
{
    String L1(String a);

    void L2();
}

class GeneralMethod  //通用方法   体系动态代理与AOP(每次只每个类相同的方法,不改变都需要的方法)
{
    public void Method1() //通用方法1
    {
        System.out.println("===================方法1==================");
    }

    public void Method2() //通用方法2
    {
        System.out.println("===================方法2==================");

    }

}


class ProsyClass implements Jiekou  //被代理类
{


    @Override
    public String L1(String a) {
        System.out.println("你好我喜欢"+a);
        return a;
    }

    @Override
    public void L2() {
        System.out.println("你好啊我是void空参数代理类");
    }
}


class ProxyClass  //所有东西的代理类
{
    static Object proxyclass(Object obj) //放入被代理类
    {


       Achieve ac=new Achieve();
       ac.setObj(obj);//传输过去代理类 方便那边调用

        Object o = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), ac);
                                        //代理类的加载器       代理类要实现的接口列表  代理类被实现的方法调用InvocationHandler方法中的invoke方法将方法调用分派到的调用处理程序

        return o;
    }



}
class Achieve implements InvocationHandler//实现类
{
    private Object obj; //传输进来被代理类
    public void setObj(Object obj) {
        this.obj = obj;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  //对被代理类操作
    {

        GeneralMethod gm=new GeneralMethod();//调用他们都不需要被改变的方法     体系动态代理与AOP(每次只每个类相同的方法,不改变都需要的方法)

        gm.Method1();//方法1(AOP)

        Object o = method.invoke(obj, args); //传输被代理类的类名,代理的参数名

        gm.Method2();//方法2(AOP)

        return o;
    }
}



public class 代理 {
    public static void main(String[] args) {
        ProsyClass pr=new ProsyClass();//实例化被代理类

        Jiekou jk1 = (Jiekou) ProxyClass.proxyclass(pr);//放入代理类 转换成代理类接口

        //第一个方法
        String s = jk1.L1("你啊");

        System.out.println(s);     /* 你啊*/


        //第2个方法
        jk1.L2();

        /*  调用一次方法执行一次
        ===================方法1==================
        你好我喜欢你啊
        ===================方法2==================
        你啊
        ===================方法1==================
        你好啊我是void空参数代理类
        ===================方法2==================
         */
    }
}