(1)首先创建一个接口
package com.alan.proxy.dynamic1;
public interface Flyable {
void fly() ;
}
(2)创建这个接口的一个实现类
package com.alan.proxy.dynamic1;
public class Plane implements Flyable{
@Override
public void fly() {
System.out.println("Plane is Flying....");
}
}
(3)创建一个动态的代理类
package com.alan.proxy.dynamic1;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Proxy {
public static Object newInstance(Class intefc, InvocationHandler h) throws Exception {
String rt = "\r\t" ;
String methodStr = "" ;
// 首先实现这个接口的所有方法
Method[] methods = intefc.getMethods();
for (Method m : methods) {
methodStr += "@Override"+rt+
"public void "+m.getName()+"(){"+rt+
" try{"+rt+
" Method md = "+intefc.getName()+".class.getMethod(\""+m.getName()+"\");" + rt +
" h.invoke(this,md);" +rt+
" }catch(Exception ex){}" +rt+
"}" ;
}
String clazzStr = "package com.alan.proxy.dynamic1;"+rt+
"import java.lang.reflect.Method;"+rt+
"public class $Proxy1 implements "+intefc.getName()+"{"+rt+
" public $Proxy1(InvocationHandler h){"+rt+
" this.h=h;"+rt+
" }"+rt+
"private com.alan.proxy.dynamic1.InvocationHandler h ;"+rt+
methodStr +rt+
"}";
//写入到一个java文件里面
File file = new File("D:/workspace/JAVA_Pattern/src/com/alan/proxy/dynamic1/$Proxy1.java") ;
FileWriter writer = null ;
try {
writer = new FileWriter(file);
writer.write(clazzStr) ;
writer.flush() ;
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(writer !=null){
writer.close() ;
}
} catch (IOException e) {
e.printStackTrace();
}
}
//将这个Java文件加载到内存,并返回一个Object对象
URL[] urls = new URL[] {new URL("file:/" + "D:/workspace/JAVA_Pattern/src/")};
URLClassLoader ul = new URLClassLoader(urls);
Class c = ul.loadClass("com.alan.proxy.dynamic1.$Proxy1");
System.out.println(c);
//返回一个代理对象
Constructor ctr = c.getConstructor(InvocationHandler.class);
Object m = ctr.newInstance(h);
return m;
}
}
(4)创建一个代理的处理器接口
package com.alan.proxy.dynamic1;
import java.lang.reflect.Method;
public interface InvocationHandler {
void invoke(Object o, Method m) ;
}
(5)创建这个处理器的一个实现类
package com.alan.proxy.dynamic1;
import java.lang.reflect.Method;
public class CheckInvocationHandler implements InvocationHandler{
private Object target ;
public CheckInvocationHandler(Object target){
this.target = target ;
}
@Override
public void invoke(Object o, Method m) {
try {
//调用被代理对象的方法
System.out.println("飞行器 起飞前检查......");
m.invoke(target) ;
System.out.println("飞行器起飞后 检查........");
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(6)创建一个测试类
package com.alan.proxy.dynamic1;
public class Client {
public static void main(String[] args) {
try {
Flyable o = (Flyable)Proxy.newInstance(Flyable.class, new CheckInvocationHandler(new Plane())) ;
o.fly() ;
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行的结果:
class com.alan.proxy.dynamic1.$Proxy1
飞行器 起飞前检查......
Plane is Flying....
飞行器起飞后 检查........
总结:
Proxy的主要功能是:动态的创建某个接口的代理类,通过调用处理器的处理方法来实现对某个接口的代理。
XXXInvocationHandler:实现对某个被代理对象的处理。