我编写了一个简单的容器,它注册了一个类和它的接口,并且有一个方法可以从这些信息中创建对象,如下所示:
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 MyProxy implements InvocationHandler
{
private Map map;
private Object obj;
public static Object newInstance(Map map, Object obj, Class[] interfaces)
{
return Proxy.newProxyInstance(map.getClass().getClassLoader(),
interfaces,
new MyProxy(map, obj));
}
public MyProxy(Map map, Object obj)
{
this.map = map;
this.obj = obj;
}
public Object invoke(Object proxy, Method m, Object[] args) throws
Throwable
{
try {
return m.invoke(obj, args);
} catch (NoSuchMethodError e)
{
//Object result;
String methodName = m.getName();
if (methodName.startsWith("get"))
{
String name = methodName.substring(methodName.indexOf("get")+3);
return map.get(name);
}
else if (methodName.startsWith("set"))
{
String name = methodName.substring(methodName.indexOf("set")+3);
map.put(name, args[0]);
return null;
}
else if (methodName.startsWith("is"))
{
String name = methodName.substring(methodName.indexOf("is")+2);
return(map.get(name));
}
return null;
}
}
}
但是对于代理类我需要提供类的类型和它的接口,但我只有它的信息X.class
。可以得到类型(例如,如果它是 X 类)X,当我有X.class
?也许我做错了,我需要改变一些东西才能让它工作,但现在我想我需要得到那个类类型,所以我可以为代理提供它?因为如果我想这样的话:
X.class x;
我会得到错误。所以我需要这样写X x;
,但我只有X.class
更新:
简单地解释一下,是否有可能得到这个:
X obj;
当你只有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 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);
}