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实际上我需要将它作为一个参数传递给proxynewInstance
例如: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来区分的话。