动态代理(案例)

126 阅读1分钟

什么是代理

代理是指某些场景下对象会找一个代理对象,来辅助自己完成一些额外的工作

如何创建代理对象

1、必须存在接口 2、被代理对象需要实现接口 3、使用Proxy类提供的方法,的对象的代理对象

image.png

image.png

image.png

动态代理小案例(测试性能)

package run;



public class FileDemo {
    public static void main(String[] args) {
    Student student = new Student();
    Teacher t = School.getProxy(student);
        System.out.println(t.land("dilei", "123456"));
        t.delete();
        t.deleteById(123);
    }
}
package run;



public class Student implements Teacher{

    @Override
    public String land(String name, String password) {
        if("dilei".equals(name) && "123456".equals(password)){
            try {
                Thread.sleep(2500);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "登入成功";
        }
        return "登入失败";

    }

    @Override
    public void delete() {
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("已删除所有用户");
    }
    @Override
    public void deleteById(int id) {
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("已删除ID为" + id + "的用户");
    }
}
package run;

public interface Teacher {
   String land(String name,String password);
   void delete();
   void deleteById(int id);

}
package run;


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

public class School {
    public static Teacher getProxy(Student student){
        return (Teacher) Proxy.newProxyInstance(student.getClass().getClassLoader(), student.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                long startTime = System.currentTimeMillis();
                Object o =  method.invoke(student,args);
                long endTime = System.currentTimeMillis();
                System.out.println(method.getName() + "方法耗时为" + (endTime - startTime) / 1000.0 + "s");
                return o;
            }
        });
    }

}