一、创建一个类
package sinldo;
public class Person {
String name;
private int age;
public Person() {
System.out.println("无参构造器");
}
public Person(String name,int age) {
System.out.println("有参构造器");
this.name=name;
this.age=age;
}
private void privaetMethod() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setName(String name, int age) {
System.out.println("name: "+name);
System.out.println("age: "+age);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
二、3种获得反射的方式
Class class1=null;//获得Class对象
//3种反射方式
//1.类.class
class1=Person.class;
//2.对象.getClass
Person person=new Person();//
class1=person.getClass();
//3.根据全类名,使用方法forName,此方法用的最多
try {
class1=Class.forName("sinldo.Person");//
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//全类名
三、创建对象
Object per = class1.newInstance();//该方法获取的对象只能使用object的方法
Person per2=(Person) class1.newInstance();//这样就可以使用Person类的方法
四、获取方法
1.获取所有普通方法,不包括私有方法
//获取方法
Class<?> class2=Class.forName("sinldo.Person");
//1.得到对应的类中有哪些方法,不能获取私有方法,获取的普通方法,不能获取构造函数
Method[] methods = class2.getMethods();
for (Method method : methods) {
System.out.println("方法;"+method);
}
2.获取所有方法,包括私有方法,但是不能获取继承类的方法
//2.获取所有方法,包括私有方法,只能获取本类声明的方法,不能获取继承的类
Method[] declaredMethods = class2.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println("getDeclaredMethods():"+method);
}
3.获取指定的方法
//3.获取指定的方法,第一个是参数是方法名,后面的参数是方法里的参数
Method Method_setName = class2.getDeclaredMethod("setName", String.class);
System.out.println("setName方法: "+Method_setName);
Method Method_setName2=class2.getDeclaredMethod("setName", String.class,int.class);
System.out.println(Method_setName2);
执行方法
//执行方法
//要使用方法,先要创建一个对象,为执行方法做准备
Object obj = class2.newInstance();//获取一个对象
//第一个参数是对象名,后面的参数是方法的参数
Method_setName2.invoke(obj, "xuejie",23);
五、获取字段
获取所有字段
Field[] declaredFields = class2.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println("Person类的字段: "+field);
}
1.获取指定对象的Field的值
//1.获取制定名字的Field
Field personField_name = class2.getDeclaredField("name");
System.out.println("指定的字段: "+personField_name.getName());
2.针对已声明的对象,获取指定的Field的值,但是这个Field不能是私有的。
//2.获取指定对象的Field的值,这个Field不能是私有的,不然获取不了
Person per3=new Person("xue", 12);
Object object = personField_name.get(per3);
System.out.println("获取指定对象的‘name’的Field的值: "+object);
3.设置指定对象的Field的值
//3.设置指定对象的Field的值
//第一个参数是对象名,第二个参数是给指定字段设置的值
personField_name.set(per3, "zhao");
System.out.println("设置指定对象字段name的Field的值为: "+per3.name);
4.若字段是私有的,则需要调用setAccessible(true)方法
//4.若字段是私有的,则需要调用setAccessible(true)方法
Field personField_age = class2.getDeclaredField("age");
personField_age.setAccessible(true);
System.out.println("获取指定私有字段名: "+personField_age.getName());
Object object2 = personField_age.get(per3);
System.out.println("获取指定对象字段age的Field的值: "+object2);
六、获取构造器
1.获取所有的构造器
//获取构造器
//由Class对象的getConstructors()的方法获取所有的构造器
Constructor<Person>[] constructors = (Constructor<Person>[]) class2.getConstructors();
for (Constructor<Person> constructor : constructors) {
System.out.println("Person类的构造器: "+constructor);
}
2.获取指定的构造器
//获取指定的构造器
Constructor<?> constructor = class2.getConstructor(String.class,int.class);
System.out.println("指定的构造器: "+constructor);
调用构造器的newInstance()方法创建对象
Object newInstance = constructor.newInstance("xue",12);
System.out.println(newInstance);