求職複習系列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文件


分享到:


相關文章: