步骤1.获取Class对象
四种方式:
1、Class.forName(全类名)
2、类名.class
3、对象.getClass()
4、假如是包装类型,比如Integer,则可以使用Integer.Type
package Test;
public class Person {
}
package Test;
public class Demo01 {
public static void main(String[] args) throws ClassNotFoundException {
Person p=new Person();
Class class1 = Class.forName("Test.Person");
Class class2=Person.class;
Class class3 = p.getClass();
System.out.println(class1==class2);//比较的是地址
}
}
结果为true,因为他们是同一个对象。
步骤2.使用Class对象的方法
package Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo01 {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
Person p=new Person(25,"杰克");
Class class1 = Class.forName("Test.Person");
Constructor constructor1=class1.getConstructor();//无参构造函数
System.out.println(constructor1);
Object newInstance = constructor1.newInstance();
System.out.println(newInstance);
Constructor constructor2=class1.getConstructor(int.class,String.class);//有参构造
System.out.println(constructor2);
Object newInstance2 = constructor2.newInstance(30,"Yang");
System.out.println(newInstance2);
Field field = class1.getField("age");
Object object = field.get(new Person());
System.out.println(object);//0
Object object2 = field.get(p);
System.out.println(object2);//25
Field field2 = class1.getDeclaredField("name");//对于private要暴力获取
field2.setAccessible(true);//打开权限
Object object3 = field2.get(new Person());
System.out.println(object3);
Object object4 = field2.get(p);
System.out.println(object4);
field2.set(p, "Jack");//给对象p的name属性赋值
System.out.println(p);
Method method = class1.getMethod("run");//name就是要调用的方法名
method.invoke(p);//执行run方法,p对象执行run方法
Method method2 = class1.getDeclaredMethod("sleep");//对于私有方法
method2.setAccessible(true);
method2.invoke(p);
}
}
package Test;
public class Person {
public int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
public void run(){
System.out.println("run........."+name);
}
private void sleep(){
System.out.println("sleep......"+name);
}
}