如果你的这些类都有共性,那么你可以用java多态的特性来实现详见代码: package com.test;import java.util.HashMap; import java.util.Map;public class Test { public static void main(String[] args) { Map<String, Hello> map = new HashMap<String, Hello>(); map.put("1", new Hello1()); map.put("2", new Hello2()); map.put("3", new Hello3());
Hello hello = map.get("2"); hello.test(); } } class Hello1 implements Hello{ public void test(){ System.out.println("Hello1"); } } class Hello2 implements Hello{ public void test(){ System.out.println("Hello2"); } } class Hello3 implements Hello{ public void test(){ System.out.println("Hello3"); } } 接口方法: package com.test;public interface Hello { public void test(); }因为所有的类都实现同一接口,所以程序直接Hello hello = map.get("2");写可以得到具体的实现类,然后调用方法实现每个类不同的操作。如果你的类没有共性的话,我只能想到1楼说的方法,使用instanof。
Hello1 1 = (Hello1) obj;
}
……
但是我想直接转换成具体的对象 就不用反射了
package com.test;import java.util.HashMap;
import java.util.Map;public class Test {
public static void main(String[] args) {
Map<String, Hello> map = new HashMap<String, Hello>(); map.put("1", new Hello1()); map.put("2", new Hello2()); map.put("3", new Hello3());
Hello hello = map.get("2");
hello.test();
}
}
class Hello1 implements Hello{
public void test(){
System.out.println("Hello1");
}
}
class Hello2 implements Hello{
public void test(){
System.out.println("Hello2");
}
}
class Hello3 implements Hello{
public void test(){
System.out.println("Hello3");
}
}
接口方法:
package com.test;public interface Hello {
public void test();
}因为所有的类都实现同一接口,所以程序直接Hello hello = map.get("2");写可以得到具体的实现类,然后调用方法实现每个类不同的操作。如果你的类没有共性的话,我只能想到1楼说的方法,使用instanof。
反射相比使用instanof便于后期的维护,及减少了代码的冗余。
1、如果value中的对象是有一定的关系的,你定义一个借口。这些类都实现这个接口。
放入map后,再取出使用的时候,不需要转变为以前的类对象,只需要用接口就可以。
例:list系列
2、如果,你的对象没有关系,哪就改变你的key,添加的时候,将对象的名称加入到key中。
解析key。
interface IClassCaller {
void callMethod(Object... params);
}class TypeA {
public void methodA (int param) {
...
}
}class TypeB {
public void methodB (String param) {
...
}
}class Main {
private HashMap<String, IClassCaller> iMap; public static void main(String[] args) {
final TypeA a = new TypeA();
final TypeB b = new TypeB(); iMap.put("1", new IClassCaller {
@Override
public void callMethod(Object ... params) {
a.methodA((Integer) params[0]);
}
}); iMap.put("2", new IClassCaller {
@Override
public void callMethod(Object ... params) {
a.methodB((String) params[0]);
}
}); iMap.get("1").callMethod(5);
iMap.get("2").callMethod(5);
}
}这个办法的唯一缺陷就是当你的方法带不同参数的时候用起来不方便,仍然是需要知道拿出来的对象是什么。如果不带参数就好使了
这就与spring容器里的bean一样的.应当这样:
Class clazz = (Class)map.get("?");
Object oo = clazz.newInstance();
然后用反谢调用默认的构造方法,生成一个对象(不带参数,所有类都有样操作)
在spring里这个oo是谁用谁转换, 如果我get(2),我本来就知道2是何类,强制转换一下就行了.
想要使用的人用key来取对象就是,他既然知道了key自然就知道自己要什么,
而容器又不要使用,只是存放,所以不需要知道是什么对象.
我要取一个Hello2 我知道要用key=2才能取到:
Class clazz = (Class)map.get("2");
Object oo = clazz.newInstance();
Hello2 hh = (Hello2 )oo;
这就完事了,得到了hello2类的实例对象了.