之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下
另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuye/article/details/7700455
class Person { private String name; private int age; // public Person(String name,int age){ // this.name=name; // this.age=age; // } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void add() { System.out.println("add"); } public void addWithParameters(String name, int age) { System.out.println("add带参数方法" + name + age); } public static void sayHello(){ System.out.println("hello"); } }
1、获取class object
由实例获取
Person person=null;
Class<?> personClass=person.getClass();
由class名获取
Class<?> personClass=Class.forName(com.test.Person);
2、实例化一个对象
构造函数是无参的:
Person person = (Person)c.newInstance();
构造函数是含参的,这时候要先获得构造器,由构造器new一个实例:
Constructor<?> constructor=c.getConstructor(String.class,int.class);
Person person=(Person) constructor.newInstance("寒顺平",66);
3、调用这个class的静态属性、方法,这时不需要实例对象
Method method=c.getMethod("sayHello");//参数是方法的名字
method.invoke(null); //必须要有参数null
4、调用这个class的非静态属性、非静态方法,这时需要实例化一个对象
不含参数
Method method=personClass.getMethod("add");
method.invoke(personClass.newInstance());
含参数(构造函数和调用方法都含参)
Method method=personClass.getMethod("addWithParameters",String.class,int.class);
Constructor<?> constructor=personClass.getConstructor(String.class,int.class);
method.invoke(constructor.newInstance("寒顺平",66),"hello",22);
小结:获取某个class的静态属性以及方法是不需要将类实例化的,只要这个类已经被加载了,就可以通过相应的方法获取这些信息,但是想要调用某个非静态方法的时候,就必须有一个实例化的对象。