什么是代理
代理是指某些场景下对象会找一个代理对象,来辅助自己完成一些额外的工作
如何创建代理对象
1、必须存在接口 2、被代理对象需要实现接口 3、使用Proxy类提供的方法,的对象的代理对象
动态代理小案例(测试性能)
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;
}
});
}
}