这样吧,给LZ你几个问题思考,那你就知道这样的代码有没有用了
比如有这样一个类
class A {
private name;
public A() {
this("A");
}
public A(Sring name) {
this.name = name;
}
private viod showName() {
System.out.println("name=" + name);
}
}
1 现在我有个方法
Object createInstance(String className, Class[] params, Object[] args) {
//LZ试试看这里应该怎么写代码最方便,扩展性也最好
}
根据传入的类名字和参数,来生成不同的类实例,例如调用createInstance("A", new Class[]{}, new Object[]{})能够实现和new A()一样的结果,调用createInstance("A", new Class[]{String.class}, new Object[]{"ABC"})能够实现和new A("ABC")一样的结果,调用createInstance("B", new Class[]{}, new Object[]{})能够实现和new B()一样的结果,等等
2 我现在有个方法
public Object invokeMethod(A a, String methodName, Class[] params, Object[] args) {
//LZ看看这里应该怎么写代码能让其实现根据传入的某个方法名和参数而调用a对象相应的方法,比如调用invokeMethod(a, "showName", new Class[]{}, new Object[]{}); 能实现和调用a.showName()一样的结果,其中a是A的实例
}
打个比方,比如说,人是一个类(Human Class),张三,李四是具体的人的对象(Human instance),即 Human 张三 = new Human("张三"),Human 李四 = new Human("李四"),这时我把张三挑出来,我要判断张三是什么类,比如调用 张三.getClass(),那么,getClass返回值应该是一个特殊的类的对象,而不是人的对象,对不对?也就是Class c = 张三.getClass(),而不是 Human c = 张三.getClass(), 因为张三,李四这样的才算是人的对象。那么这个特殊的类的对象c就是你所说的类对象。同样的,Class.forname( "Human"),返回的就应该是人的类的对象而不是人的对象。
再打个比方,比如你有一个配置文件,就用porperties文件吧,里面有这样的设置
classname=Human (根据不同的需求可以设置需要用不同的类)
这时候,你想从配置文件中读出类的名字,然后想通过这个名字去生成实例,而读出文件时,得到的是"Human"这样的字符串,你要怎么用它生成实例呢,总不能 "Human" 张三 = new "Human"("张三")吧,字符串是不能当作类使用的,对不对?你也不可能在配置文件中设置一个类,然后从文件中读出来就是一个类,你只能在文件中设置classname=Human这样的字符串(文件里的内容都算是字符串),你从文件里读出来的也只能是字符串,对不对?那么这时候,你要生成实例,就必须通过这个特殊的类对象,即 Class c = Class.forName("Human");这样你得到这个类对象c以后,就可以通过相应的方法去创建人对象或者改变某个人对象的属性和方法。这个类对象到底有什么用?这里就是主要的用处了。