Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ';X.class';要得到它';s';X';类型?_Java_Class_Java.lang.class - Fatal编程技术网

Java ';X.class';要得到它';s';X';类型?

Java ';X.class';要得到它';s';X';类型?,java,class,java.lang.class,Java,Class,Java.lang.class,我已经编写了一个简单的容器,它注册了一个类及其接口,并且有一个方法可以根据这些信息创建对象,如下所示: public class DIContainer { protected static DIContainer instance; protected Hashtable<Class<?>, Class<?>> classMap; protected DIContainer(){ this.classMap = ne

我已经编写了一个简单的容器,它注册了一个类及其接口,并且有一个方法可以根据这些信息创建对象,如下所示:

public class DIContainer {
    protected static DIContainer instance;
    protected Hashtable<Class<?>, Class<?>> classMap;

    protected DIContainer(){
        this.classMap = new Hashtable<Class<?>, Class<?>>();
    }

    public static DIContainer getInstance(){
        if (DIContainer.instance == null)
            DIContainer.instance = new DIContainer();
        return DIContainer.instance;
    }

    public void regClass(Class<?> interf, Class<?> classToReg){
        this.classMap.put(interf, classToReg);
    }

    public Object create(Class<?> interf) throws Exception{
        if(!this.classMap.containsKey(interf))
            throw new Exception("No such class registered with "+interf.getName()+" interface");
        return this.classMap.get(interf).newInstance();

    }
}
public class X implements I{
    String name;
    X(){}

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }


}
public interface I {
    public String getName();
    public void setName(String name);
}
但对于代理类,我需要提供类的类型及其接口,但我只有
X.class
中的信息。当我有
X.class
时,是否可以获取类型(例如,如果它是class X)X?也许我这样做是错误的,为了让它工作,我需要修改一些东西,但是现在我想我需要得到那个类类型,这样我就可以为代理提供它了? 因为如果我想纠正这样的事情:

public class DIContainer {
    protected static DIContainer instance;
    protected Hashtable<Class<?>, Class<?>> classMap;

    protected DIContainer(){
        this.classMap = new Hashtable<Class<?>, Class<?>>();
    }

    public static DIContainer getInstance(){
        if (DIContainer.instance == null)
            DIContainer.instance = new DIContainer();
        return DIContainer.instance;
    }

    public void regClass(Class<?> interf, Class<?> classToReg){
        this.classMap.put(interf, classToReg);
    }

    public Object create(Class<?> interf) throws Exception{
        if(!this.classMap.containsKey(interf))
            throw new Exception("No such class registered with "+interf.getName()+" interface");
        return this.classMap.get(interf).newInstance();

    }
}
public class X implements I{
    String name;
    X(){}

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }


}
public interface I {
    public String getName();
    public void setName(String name);
}
X.X类
我会犯错误。所以我需要这样写
X,但我只有
X.class

更新:

简单地说,有没有可能得到:

xobj

当您只有
X.class
(使用
X.class.newInstance
时,它会实例化它(就像使用
new
?),但我还不需要实例化obj)

更新2

我试过这个:

Object x = (Object) MyProxy.newInstance(map, this.classMap.get(interf).newInstance(), new Class[] {this.classMap.get(interf)});
但是我得到了这个错误:

Exception in thread "main" java.lang.IllegalArgumentException: class lab.X is not visible from class loader
我的X类看起来像这样:

public class DIContainer {
    protected static DIContainer instance;
    protected Hashtable<Class<?>, Class<?>> classMap;

    protected DIContainer(){
        this.classMap = new Hashtable<Class<?>, Class<?>>();
    }

    public static DIContainer getInstance(){
        if (DIContainer.instance == null)
            DIContainer.instance = new DIContainer();
        return DIContainer.instance;
    }

    public void regClass(Class<?> interf, Class<?> classToReg){
        this.classMap.put(interf, classToReg);
    }

    public Object create(Class<?> interf) throws Exception{
        if(!this.classMap.containsKey(interf))
            throw new Exception("No such class registered with "+interf.getName()+" interface");
        return this.classMap.get(interf).newInstance();

    }
}
public class X implements I{
    String name;
    X(){}

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }


}
public interface I {
    public String getName();
    public void setName(String name);
}
其界面如下所示:

public class DIContainer {
    protected static DIContainer instance;
    protected Hashtable<Class<?>, Class<?>> classMap;

    protected DIContainer(){
        this.classMap = new Hashtable<Class<?>, Class<?>>();
    }

    public static DIContainer getInstance(){
        if (DIContainer.instance == null)
            DIContainer.instance = new DIContainer();
        return DIContainer.instance;
    }

    public void regClass(Class<?> interf, Class<?> classToReg){
        this.classMap.put(interf, classToReg);
    }

    public Object create(Class<?> interf) throws Exception{
        if(!this.classMap.containsKey(interf))
            throw new Exception("No such class registered with "+interf.getName()+" interface");
        return this.classMap.get(interf).newInstance();

    }
}
public class X implements I{
    String name;
    X(){}

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }


}
public interface I {
    public String getName();
    public void setName(String name);
}

如果我理解正确,您正在尝试实例化类
X.class
?如果是这种情况,您只需调用
X.class.newInstance()。

java.lang.IllegalArgumentException:class lab.X在中不可见 类加载器

这个错误信息不是很清楚吗?您需要确保使用相同的类装入器

在这里:

public static Object newInstance(Map map, Object obj, Class[] interfaces)
{
    return Proxy.newProxyInstance(map.getClass().getClassLoader(),
                                  interfaces,
                                  new MyProxy(map, obj));
}
您不应该使用映射的类加载器,我认为您应该使用目标对象的类加载器,或者作为单独的参数传递适当的类加载器

我认为您的方法中还存在其他问题,例如不同步容器创建和不为代理类型使用泛型。

对于第一部分,类DIContainer,最好使用:

protected final Map<Class<?>, Class<?>> classMap;

protected DIContainer() {
    classMap = Collections.synchronizedMap(new HashMap<Class<?>, Class<?>>());
}

public <I> void regClass(Class<I> interf, Class<? extends I> classToReg) {
    this.classMap.put(interf, classToReg);
}

public <T> T create(Class<T> interf) throws Exception {
    Class<?> implClass = classMap.get(interf);
    if (implClass == null) {
        throw new Exception("No such class registered with " + interf.getName()
            + " interface");
    }
    Constructor<?> c = implClass.getConstructor();
    c.setAccessible(true); // If default constructor not public
    return interf.cast(c.newInstance());
}
protectedfinal Map>classMap;
受保护的双容器(){
classMap=Collections.synchronizedMap(新HashMap>());
}

public void regClass(Class interf,ClassWell实际上我需要将它作为一个参数传递给proxy
newInstance
例如:
X X=(X)MyProxy.newInstance(map,newclass[]{X.Class})
,但我不能从
X.class
中只得到它的类型
X
,因为我可以得到
interf
参数,它是
X.class
。所以当我需要用
X
类型分配变量
X
(因为我没有这个参数,如果可能的话,我不知道如何得到它).你建议我用
这个.classMap.get(interf)做的事情.newInstance
。但是使用这种方法,我跳过了代理类,我需要先传递给它。您可以将其声明为
对象,但我不确定如何将其键入其他对象中…那么,将反转控制容器与动态代理一起使用的最佳方法是什么?我真的不知道-我已经告诉了您我能做的一切想想看。你的
代理.newProxyInstance
代码是什么样子的?@kiruwka它没有改变。它从Java代理类中实现的代理类中获取该方法。
map
MyProxy
成员应该有什么?当你试图调用
X=(X)时,你能显示你作为map传递的内容吗MyProxy.newInstance(map,新类[]{X.Class})
@kiruwka我在下面这个例子。在这里,它使用空的初始化Hashmap,在这里它放置来自正在使用的类的方法(如
setter
methods等。您可以在一个链接示例中看到,其中proxy.newInstance是作为方法中的参数之一使用Hashmap调用的。根据您的建议,我得到了以下错误:
线程“main”java.lang.NoSuchMethodException:lab.X中的异常()
,即使我的X类有空构造函数。同样在
create
方法中,T是一个打字错误(…T…),因为它找不到任何T。我添加了
setAccessible
;在X中,构造函数不是公共的。T不是一个打字错误:
I obj=dicontainer.getInstance().create(I.class)
应该这样做;
T
类型变量成为I接口。我也应该在regClass中使用
,因为I接口只是一个例子,可以有任何接口,而不仅仅是
I
..
是一个泛型类型参数。它可以是任何名称,但约定通常只使用一个字母。在c中如果我应该用a或B来区分的话。