Sbo*_*odd 6 java code-generation interface word-wrap
所以,我意识到答案可能是"很难",但是:
我有一个奇怪的想法,并想知道在Java中是否可以创建一个方法,如:
<T> T wrapInterface (Class<T> interfaceClass, T wrappedObject) {
if (mClass.isInterface()) {
//create a new implementation of interfaceClass that, in each method,
//does some action before delegating to wrappedObject
return thatImplementation;
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本上,如果我的接口Foo定义了一个方法foo(),我希望这个方法创建一个看起来像这样的新类,用wrappedObject作为构造函数参数创建该类的实例,然后返回它:
public class GeneratedClass implements Foo {
private Foo wrapped;
public GeneratedClass (Foo wrapped) {
this.wrapped = wrapped;
}
@Override
public void foo () {
System.out.println("Calling Foo.foo() on wrapped object " +
wrapped.toString());
wrapped.foo();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑的应用程序比仅记录调用更复杂,但是记录就足够了.我想用大量的接口类型来做这个,这就是我不想手工编写所有GeneratedClasses的原因.
对于不需要语言外特征的解决方案的奖励积分(引入AspectJ或类似的东西),如果仅使用标准JDK库就可以实现双重奖励积分.
(我不需要一个精确的,可编译的答案;只需指向正确的工具/库/等设置就可以让我这样做.)
谢谢!
这是一个非常简单的实现(对于您想要做的事情可能不够好,但需要进行一些调整...主要要注意的是类加载器问题,然后可能存在一些验证问题等)我使用该代码用于测试目的,因此它不完全是生产质量的东西。
@SuppressWarnings("unchecked")
public static <T> T generateProxy(Object realObject, Class<?>... interfaces) {
return (T) Proxy.newProxyInstance(realObject.getClass().getClassLoader(), interfaces, new SimpleInvocationHandler(realObject));
}
private static class SimpleInvocationHandler implements InvocationHandler {
private Object invokee;
public SimpleInvocationHandler(Object invokee) {
this.invokee = invokee;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
method = invokee.getClass().getMethod(method.getName(), method.getParameterTypes());
if (!method.isAccessible()) {
method.setAccessible(true);
}
try {
return method.invoke(invokee, args);
} catch (InvocationTargetException e) {
throw e.getTargetException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3370 次 |
| 最近记录: |