2.3Java中的反射
案例:动态创建对象,调用对象的方法
通过反射还可以做到
a.获得这个类实现了那些接口
getInterfaces
b.得到其父类
getSuperclass
c.得到所有的构造函数
getConstructors
关于反射更详细可参考
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
Person类
package javastudy;
public class Person implements Animal {
String name;
int age;
void display()
{
String s=String.format("姓名=%s,年龄=%d", name,age);
System.out.println(s);
}
public Person()
{
}
public Person(String name,int age)//反射机制下需加public,否则调用时会提示数组数组索引超出边界
{
this.name=name;
this.age=age;
}
}
test类
<span style="font-size:18px;">package javastudy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// TODO Auto-generated method stub
Class<?>c=Class.forName("javastudy.Person");//Class.forName("") 动态加载类,将Person加载到内存中
//Class<?> 泛型(了解) 通配符
Person zhang=(Person)c.newInstance();//创建的新对象newInstance返回值为 Object类型,需要强制转换为Person
zhang.name="Jack";
zhang.age=20;
zhang.display();
Constructor<?>[] cons=c.getConstructors(); //cons 存所有构造函数
Person wang=(Person)cons[1].newInstance("Mary",30);
wang.display();
Class<?>[] inter=c.getInterfaces();
for(int i=0;i<inter.length;i++)
{
System.out.println(inter[i].getName());
}
}
}
运行结果:
姓名=Jack,年龄=20
姓名=Mary,年龄=30
javastudy.Animal