相关疑难解决方法(0)

java.lang.reflect.Proxy的替代方法,用于创建抽象类(而不是接口)的代理

根据文件:

[ java.lang.reflect.] Proxy提供了用于创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类.

newProxyMethod方法(负责生成动态代理)具有以下签名:

public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                             throws IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)

不幸的是,这可以防止生成扩展特定抽象类的动态代理(而不是实现特定的接口).这是有道理的,考虑到java.lang.reflect.Proxy"所有动态代理的超类",从而阻止另一个类成为超类.

因此,是否有任何替代方法java.lang.reflect.Proxy可以生成从特定抽象类继承的动态代理,将对抽象方法的所有调用重定向到调用处理程序?

例如,假设我有一个抽象类Dog:

public abstract class Dog {

    public void bark() {
        System.out.println("Woof!");
    }

    public abstract void fetch();

}
Run Code Online (Sandbox Code Playgroud)

是否有一个课程允许我做以下事情?

Dog dog = SomeOtherProxy.newProxyInstance(classLoader, Dog.class, h);

dog.fetch(); // Will be handled by the invocation handler
dog.bark();  // Will NOT be handled by the …
Run Code Online (Sandbox Code Playgroud)

java dynamic-proxy

80
推荐指数
1
解决办法
4万
查看次数

如何使用SWIG包装std :: function对象?

我看过很多类似的问题,但还没有找到解决我特定问题的方法.我试图SWIGify一些使用std :: function的C++ 11代码,所以我可以在我的Java应用程序中使用它.

我遇到过像这样的共享指针:

virtual std::shared_ptr<some::ns::TheThing> getTheThing(unsigned short thingID);
Run Code Online (Sandbox Code Playgroud)

并使用shared_ptr指令成功处理它们,如下所示:

%shared_ptr(some::ns::TheThing);
Run Code Online (Sandbox Code Playgroud)

我遇到过这样的共享指针向量:

virtual std::vector<std::shared_ptr<some::ns::TheThing>> getAllTheThings() const = 0;
Run Code Online (Sandbox Code Playgroud)

并使用如下模板成功处理它们:

%template(ThingVector) std::vector<std::shared_ptr<some::ns::TheThing>>;
Run Code Online (Sandbox Code Playgroud)

现在我有一个像这样的方法:

 void registerThingCallback(std::function<void(std::shared_ptr<some::ns::TheThing>) > func);
Run Code Online (Sandbox Code Playgroud)

我无法让SWIG正确包装它.我已经尝试使用%回调,导演,%模板和%内联功能代码,因为我已经看到所有这些事情的例子,但是还没有能够得到任何似乎接近工作的东西.如果有帮助(清理和减少),这里有一个关于函数调用的更多上下文:

thing_callback.h

#include <functional>

namespace some {
  namespace ns {

    /**
     * Hold some callbacks.
     */
    class ThingCallbacks {
    public:

        /**
         * Registers a callback 
         * @param func The callback function
         */
        void registerThingCallback(std::function<void(std::shared_ptr<some::ns::TheThing>) > func);

    };

  }
}
Run Code Online (Sandbox Code Playgroud)

更新

根据Flexo下面的答案,我更接近解决方案.我能够让下面的例子完全像宣传的那样工作.我尝试将它合并到我的实际代码中,但遇到了问题.为了扩展我之前的简化示例,这里是我对TheThing的定义:

test_thing.h

#ifndef THE_THING_H
#define THE_THING_H

#include <string>

namespace some {
  namespace ns …
Run Code Online (Sandbox Code Playgroud)

c++ java swig c++11 std-function

8
推荐指数
1
解决办法
2229
查看次数

使用SWIG从C ++生成C#接口

如何使用SWIG使用SWIG从C ++生成C#接口(或至少一个C#可模拟的基类)?

鉴于:

C ++:

class IWidget
{
public:
     virtual void Flob() = 0;
};

class Widget : public IWidget
{
public:
     void Flob() {};
};
Run Code Online (Sandbox Code Playgroud)

我想输出C#:

public interface IWidget
{
     void Flob();
}

public class Widget : IWidget
{...}
Run Code Online (Sandbox Code Playgroud)

注意:解决方案不必一定是接口,但是我确实需要能够使用Moq或Rhino.Mocks等模拟框架来模拟C#Widget类的基础。我的尝试仅产生了没有公共构造函数的生成的C#。

c# c++ swig interface mocking

6
推荐指数
1
解决办法
4448
查看次数

标签 统计

c++ ×2

java ×2

swig ×2

c# ×1

c++11 ×1

dynamic-proxy ×1

interface ×1

mocking ×1

std-function ×1