如果是动态加载就不能采用强制转换类型这种方法。因为我们并不知道这个类到底是Class到底是什么class。也就说如果你用这些代码:
String className="MyClass";
Clsss iClass = Class.forName(className);
Object iObj =iClass.newInstance();
生成了iObj,你确实不能用classname来动态转换。
如果要使用这个生成的object应该怎么办呢?
我假设你的MyClass如下定义。
public class MyClass
{
public MyClass(){
}
public void sayHello(String who)
{
System.out.println("hello world "+who);
}
}
如果要动态的使用sayHello,可以用如下代码
import java.lang.reflect.*;
class TestClass
{
public static void main(String[] args)
{
//这是sayHello的参数类型为String
Class[] parameterTypes={String.class};
//准备把you这次字符串传进去
Object[] parameter={"you"};
//以下是动态装入的类名和需要调用的函数名
String className="MyClass";
String methodName="sayHello";
try{
Class iClass=Class.forName(className);
//产生一个Method对象(sayHello)
Method method=iClass.getMethod(methodName,parameterTypes);
//Class.forname只是动态的装入了类,我们还需要产生对象,因此
//需要调用它的构造函数,用以下方法调用
Constructor con=iClass.getConstructor(new Class[]{});
Object myclass=con.newInstance(new Object[]{});
//对象生成啦,现在调用它
method.invoke(myclass,parameter);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
上面的代码答应hello world you
这段代码等同于
MyClass myclass=new MyClass();
myclass.sayHello("you");
由此可以看出动态的调用比静态的复杂得多。具体的api函数请参考java api
String className="MyClass";
Clsss iClass = Class.forName(className);
Object iObj =iClass.newInstance();
生成了iObj,你确实不能用classname来动态转换。
如果要使用这个生成的object应该怎么办呢?
我假设你的MyClass如下定义。
public class MyClass
{
public MyClass(){
}
public void sayHello(String who)
{
System.out.println("hello world "+who);
}
}
如果要动态的使用sayHello,可以用如下代码
import java.lang.reflect.*;
class TestClass
{
public static void main(String[] args)
{
//这是sayHello的参数类型为String
Class[] parameterTypes={String.class};
//准备把you这次字符串传进去
Object[] parameter={"you"};
//以下是动态装入的类名和需要调用的函数名
String className="MyClass";
String methodName="sayHello";
try{
Class iClass=Class.forName(className);
//产生一个Method对象(sayHello)
Method method=iClass.getMethod(methodName,parameterTypes);
//Class.forname只是动态的装入了类,我们还需要产生对象,因此
//需要调用它的构造函数,用以下方法调用
Constructor con=iClass.getConstructor(new Class[]{});
Object myclass=con.newInstance(new Object[]{});
//对象生成啦,现在调用它
method.invoke(myclass,parameter);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
上面的代码答应hello world you
这段代码等同于
MyClass myclass=new MyClass();
myclass.sayHello("you");
由此可以看出动态的调用比静态的复杂得多。具体的api函数请参考java api
解决方案 »
- 一段代码中,只有一个知识点不明白,不用看完全代码,请进来看看~~~
- 『求助』请问各位大侠apache.jasper.JasperException是什么错误!!!!!!!!!!
- 各位大侠:怎样在一个job类里面获取cron expression表达式?
- Icon图标使用问题
- 这个程序可以关闭,怎么设置背景颜色???
- JDK那里出了问题Exception in thread "main" java.lang.NoClassDefFoundError: test
- 求java读、写ms word 的源码
- 谁来解释一个intern方法的使用
- 我改写了代码,重新编译了,为什么页面浏览到的还是原来的
- 在Applet中如何直接改变字体的大小(无内容)
- 请教:如何反复、重建JTable中的标题和数据信息?
- jTextArea 里的字体如何设置色彩?
在Object _obj =Class.forName(...)").newInstance();得到对象以后
调用isInstance(),判断得到的obj是否为能进行某项操作的对象。
抄thinking in java中的例子:
//: PetCount3.java
// Using Java 1.1 isInstance()
package c11.petcount3;
import java.util.*;class Pet {}
class Dog extends Pet {}
class Pug extends Dog {}
class Cat extends Pet {}
class Rodent extends Pet {}
class Gerbil extends Rodent {}
class Hamster extends Rodent {}class Counter { int i; }public class PetCount3 {
public static void main(String[] args) {
Vector pets = new Vector();
Class[] petTypes = {
Pet.class,
Dog.class,
Pug.class,
Cat.class,
Rodent.class,
Gerbil.class,
Hamster.class,
};
try {
for(int i = 0; i < 15; i++) {
// Offset by one to eliminate Pet.class:
int rnd = 1 + (int)(
Math.random() * (petTypes.length - 1));
pets.addElement(
petTypes[rnd].newInstance());
}
} catch(InstantiationException e) {}
catch(IllegalAccessException e) {}
Hashtable h = new Hashtable();
for(int i = 0; i < petTypes.length; i++)
h.put(petTypes[i].toString(),
new Counter());
for(int i = 0; i < pets.size(); i++) {
Object o = pets.elementAt(i);
// Using isInstance to eliminate individual
// instanceof expressions:
for (int j = 0; j < petTypes.length; ++j)
if (petTypes[j].isInstance(o)) {
String key = petTypes[j].toString();
((Counter)h.get(key)).i++;
}
}
for(int i = 0; i < pets.size(); i++)
System.out.println(
pets.elementAt(i).getClass().toString());
Enumeration keys = h.keys();
while(keys.hasMoreElements()) {
String nm = (String)keys.nextElement();
Counter cnt = (Counter)h.get(nm);
System.out.println(
nm.substring(nm.lastIndexOf('.') + 1) +
" quantity: " + cnt.i);
}
}
} ///:~