gpt4 book ai didi

Java:在运行时创建类型的新实现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:37 25 4
gpt4 key购买 nike

所以,我意识到这个问题的答案可能是“这很难”,但是:

我有一个奇怪的想法,想知道是否可以在 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;
}
}

所以基本上,如果我的接口(interface) 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();
}
}

我正在考虑的应用程序比仅记录调用更复杂,但记录足以满足这个想法。我想对大量接口(interface)类型执行此操作,这就是为什么我不会只手写所有 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();
}
}
}

关于Java:在运行时创建类型的新实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com