我写了一个简单的java动态代理模拟:里面有UserMgrImp实现UserMgr接口,TransctionHandler和TimeHandler实现Handler接口,有一个Proxy类用来生成动态的的代理对象。在测试方法里,我单独为UerMgrImp添加TransctionHandler或TimeHandler可以实现其功能,但是我想把TransctionHandler和TimeHandler同时添加上去,让两者同时实现,怎么弄??
TransctionHandler代码:package com.ts.proxy;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class TransctionHandler implements Handler {
private Object target;
public TransctionHandler(Object target) {
super();
this.target = target;
}
@Override
public void invoke(Object o, Method m) {
System.out.println("transction begain");
try {
m.invoke(target);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("transction commit");
}
}
TimeHandler代码:
package com.ts.proxy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TimeHandler implements Handler {
private Object target;
public TimeHandler(Object target) {
super();
this.target = target;
}
@Override
public void invoke(Object o,Method m) {
long start = System.currentTimeMillis();
System.out.println("start time:" +start);
try {
m.invoke(user);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
};
long end = System.currentTimeMillis();
System.out.println("time:" +(end-start));
}
}
Proxy部分代码:
public static Object newProxy(Class insef,Handler h)throws Exception{
String rt = "\n\t";
String methodStr = "";
Method [] methods = insef.getMethods();
for(Method m : methods){
methodStr =
" @Override"+ rt +
" public void " + m.getName()+"(){"+ rt +
" try{"+ rt +
" Method md = "+insef.getName()+".class.getMethod(\"" +m.getName()+"\");" + rt+
" h.invoke(this,md);"+ rt+
" }catch(Exception e){e.printStackTrace();}"+ rt +
" }";
}
String str =
"package com.ts.proxy;"+ rt +
"import java.lang.reflect.Method;"+ rt+
"public class CarTimeProxy implements "+insef.getName() +"{"+ rt +
" com.ts.proxy.Handler h;"+ rt +
" public CarTimeProxy(Handler h){"+ rt +
" super();"+ rt +
" this.h = h;"+ rt +
" }"+ rt +
methodStr + rt +
"}";
File f = new File("d:/src/com/ts/proxy/CarTimeProxy.java");
FileWriter fw = new FileWriter(f);
fw.write(str);
fw.flush();
fw.close();
//compiler
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
Iterable units = fileMgr.getJavaFileObjects(f);
JavaCompiler.CompilationTask task = compiler.getTask(null, fileMgr, null, null, null, units);
task.call();
fileMgr.close();
//loader
URL[] urls = new URL[]{new URL("file:/d:src/")};
URLClassLoader ur = new URLClassLoader(urls);
Class c = ur.loadClass("com.ts.proxy.CarTimeProxy");
Constructor cst = c.getConstructor(Handler.class);
Object o2 = cst.newInstance(h);
//System.out.println(o.getClass().getName());
return o2; }
}UserMgrImp代码:
package com.ts.proxy;
public class UserMgrImp implements UserMgr {
@Override
public void add() {
System.out.println("1:连接User表");
System.out.println("2:添加User对象");
}
}在Test里面我是这样写的:UserMgr u = new UserMgrImp();
Handler h = new TimeHandler(u);
Handler h2 = new TransctionHandler(h);
UserMgr user = (UserMgr)Proxy.newProxy(UserMgr.class,h2);
user.add();
这时运行会报: object is not an instance of declaring class.
求解决!!
TransctionHandler代码:package com.ts.proxy;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class TransctionHandler implements Handler {
private Object target;
public TransctionHandler(Object target) {
super();
this.target = target;
}
@Override
public void invoke(Object o, Method m) {
System.out.println("transction begain");
try {
m.invoke(target);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("transction commit");
}
}
TimeHandler代码:
package com.ts.proxy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TimeHandler implements Handler {
private Object target;
public TimeHandler(Object target) {
super();
this.target = target;
}
@Override
public void invoke(Object o,Method m) {
long start = System.currentTimeMillis();
System.out.println("start time:" +start);
try {
m.invoke(user);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
};
long end = System.currentTimeMillis();
System.out.println("time:" +(end-start));
}
}
Proxy部分代码:
public static Object newProxy(Class insef,Handler h)throws Exception{
String rt = "\n\t";
String methodStr = "";
Method [] methods = insef.getMethods();
for(Method m : methods){
methodStr =
" @Override"+ rt +
" public void " + m.getName()+"(){"+ rt +
" try{"+ rt +
" Method md = "+insef.getName()+".class.getMethod(\"" +m.getName()+"\");" + rt+
" h.invoke(this,md);"+ rt+
" }catch(Exception e){e.printStackTrace();}"+ rt +
" }";
}
String str =
"package com.ts.proxy;"+ rt +
"import java.lang.reflect.Method;"+ rt+
"public class CarTimeProxy implements "+insef.getName() +"{"+ rt +
" com.ts.proxy.Handler h;"+ rt +
" public CarTimeProxy(Handler h){"+ rt +
" super();"+ rt +
" this.h = h;"+ rt +
" }"+ rt +
methodStr + rt +
"}";
File f = new File("d:/src/com/ts/proxy/CarTimeProxy.java");
FileWriter fw = new FileWriter(f);
fw.write(str);
fw.flush();
fw.close();
//compiler
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
Iterable units = fileMgr.getJavaFileObjects(f);
JavaCompiler.CompilationTask task = compiler.getTask(null, fileMgr, null, null, null, units);
task.call();
fileMgr.close();
//loader
URL[] urls = new URL[]{new URL("file:/d:src/")};
URLClassLoader ur = new URLClassLoader(urls);
Class c = ur.loadClass("com.ts.proxy.CarTimeProxy");
Constructor cst = c.getConstructor(Handler.class);
Object o2 = cst.newInstance(h);
//System.out.println(o.getClass().getName());
return o2; }
}UserMgrImp代码:
package com.ts.proxy;
public class UserMgrImp implements UserMgr {
@Override
public void add() {
System.out.println("1:连接User表");
System.out.println("2:添加User对象");
}
}在Test里面我是这样写的:UserMgr u = new UserMgrImp();
Handler h = new TimeHandler(u);
Handler h2 = new TransctionHandler(h);
UserMgr user = (UserMgr)Proxy.newProxy(UserMgr.class,h2);
user.add();
这时运行会报: object is not an instance of declaring class.
求解决!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货