求职复习系列12 代理模式

代理模式(Proxy)

静态代理

访问对象时加入一定的间接性,在间接性可以添加很多用途

代理对象:增强后的对象

目标:被增强的对象

聚合方式
public class ProxyTes {
public static void main(String[] args) {
Action action=new UserAction();
ProxyAction proxyAction=new ProxyAction(action);
proxyAction.doAction();
}
}
/**
* 接口
*/
interface Action{
void doAction();
}
/**
* 实现类
*/
class UserAction implements Action{
@Override
public void doAction() {
System.out.println("处理用户请求");
}
}
/**
* 代理模式 实现接口
*/
class ProxyAction implements Action{
//注入对象
private Action action;
public ProxyAction(Action action) {
this.action = action;
}
//计算运行时间

public void doAction(){
long start=System.currentTimeMillis();
//todo
action.doAction();
//todo
long end=System.currentTimeMillis();
System.out.println("共耗时:"+(end-start)+"ms");
}
}
继承方式
代理类继承代理对象,重写方法,添加需要的增强

动态代理

静态代理,一个对象对产生一个类,会创建很多的代理类,

但是我们需要动态代理

动态代理时候,需要通过方法产生对应的对象,主要通过反射完成,传入类名,生成对象,

得到.java
编译得到class
newInstance
blic class Proxy implements Serializable {
public static Object newInstance(Class> clazz) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {
//method
Method method[] = clazz.getDeclaredMethods();
StringBuilder sb = new StringBuilder(1024);
sb.append("package com.xs.proxy;\\n");//声明包
sb.append("import java.lang.reflect.Method;\\n");//导入包
sb.append("public class $Proxy implements " + clazz.getSimpleName()+ "\\n {");//类声明
sb.append("\\t " + clazz.getSimpleName() + " interfaces;\\n\\n");//接口声明
//构造方法
sb.append("\\tpublic $Proxy( " + clazz.getSimpleName() + " interfaces)\\n");
sb.append("\\t{\\n");

sb.append("\\t\\tthis.interfaces = interfaces;\\n");
sb.append("\\t}\\n\\n");
//方法
for (Method m : method) {
sb.append("\\tpublic " + m.getReturnType() + " " + m.getName() + "()\\n");
sb.append("\\t{\\n");
sb.append("\\t\\tSystem.out.println(\"Before Hello World!\");\\n");
sb.append("\\t\\tinterfaces." + m.getName() + "();\\n");
sb.append("\\t\\tSystem.out.println(\"After Hello World!\");\\n");
sb.append("\\t}\\n");
}
// 最后一个}
sb.append("}");
/** 生成一段Java代码 */
String fileDir = System.getProperty("user.dir");
String fileName = fileDir + "\\\\src\\\\main\\\\java\\\\com\\\\xs\\\\proxy\\\\$Proxy.java";
File javaFile = new File(fileName);
Writer writer = new FileWriter(javaFile);
System.out.println(fileName);
writer.write(sb.toString());
writer.close();
/** 动态编译这段Java代码,生成.class文件 */
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager sjfm = compiler.getStandardFileManager(null, null, null);
Iterable extends JavaFileObject> iter = sjfm.getJavaFileObjects(fileName);
JavaCompiler.CompilationTask ct = compiler.getTask(null, sjfm, null, null, null, iter);
ct.call();
sjfm.close();
/** 将生成的.class文件载入内存,默认的ClassLoader只能载入CLASSPATH下的.class文件 */
URL[] urls = new URL[]{(new URL("file:\\\" + System.getProperty("user.dir") + "\\\\src\\\\main\\\\java\\\"))};
URLClassLoader ul = new URLClassLoader(urls);
Class> c = ul.loadClass("com.xs.proxy.$Proxy");
return c.newInstance();
}

对象的创建,class文件


分享到:


相關文章: