案例:动态创建对象,调用对象的方法
通过反射还可以做到
a.获得这个类实现了那些接口
getInterfaces
b.得到其父类
getSuperclass
c.得到所有的构造函数
getConstructors
c=Person.class;
Person a=newPerson();
c=a.getClass();
关于反射更详细可参考
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
Person类
<span style="font-size:18px;">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;
}
}</span>
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());
}
}
}</span>
运行结果:
姓名=Jack,年龄=20
姓名=Mary,年龄=30
javastudy.Animal
创建Animal接口,通过反射查找接口,运行: