创建对象种获取对象的构造方法getConstructor(),getConstructors(),getDeclaredgetConstructor(),getDeclaredConstructors()四种方法,前两者是获取的是公共的构造方法,后两者可以获取非公共的,访问属性和调用方法类似,均有get和getDeclared类似的方法。
准备Person类
package wxc.domain;
public class Person {
private int id;
private String name;
public Person() {
System.out.println("无参构造方法");
}
public Person(int id, String name) {
this.id = id;
this.name = name;
System.out.println("有参构造方法");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
public String say(int id,String name) {
return "我是"+id+"号选手,我的名字是"+name+",大家好!";
}
}
准备主方法A类
package wxc.domain;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.jar.Attributes.Name;public class A {
public static void main(String[] args) throws Exception {/*1.0 获取Class类的实例三种方式 */
// 对象.getClass()获取
// Person p = new Person();
// Class clazz = p.getClass();
// System.out.println(clazz);// Class.forName("包.类") 用类的全路径获取
// Class clazz = Class.forName("wxc.domain.Person");
// System.out.println(clazz);
// 类.class获取
// Class clazz = Person.class;
// System.out.println(clazz);
/*1.1 通过反射创建对象 */
// 通过无参构造方法实例化对象
// Class clazz = Person.class;// 获取Class对象
// Person p = (Person)clazz.newInstance();//实例化Person对象
// System.out.println(p);
// 通过有参构造方法实例化对象
// Class clazz = Person.class;// 获取Class对象
// Constructor cons = clazz.getConstructor(int.class,String.class); //获取共有的有参构造
// Person p = (Person)cons.newInstance(1,"wxc"); //实例化Person对象
// System.out.println(p);
// Class clazz = Person.class;// 获取Class对象
// Constructor cons []= clazz.getConstructors();//获取共有的有参构造数组
// for (Constructor c : cons) {
// System.out.println(c);
// }
// Person p = (Person)cons[1].newInstance(1,"wxc");//代码的cons[1]与Person方法里面的有参数构造方法顺序有关
// System.out.println(p);
/*1.2 通过反射访问属性 */
// 通过getDeclaredFields()获得属性
// Class clazz = Person.class;//创建Class对象
// Person p = (Person)clazz.newInstance();//实例化对象
//
// Field idField = clazz.getDeclaredField("id");//获取指定名称的属性
// idField.setAccessible(true);//设置通过反射访问该属性时取消权限检查
// idField.set(p ,1);//调用set方法给p的指定属性赋值
//
// Field nameField = clazz.getDeclaredField("name");
// nameField.setAccessible(true);//设置通过反射访问该属性时取消权限检查
// nameField.set(p, "wxc");//调用set方法给p的指定属性赋值
//
// System.out.println(p);
// 通过getDeclaredFields()获得属性
// Class clazz = Person.class;//创建Class对象
// Person p = (Person)clazz.newInstance();//实例化对象
//
// Field[] fields = clazz.getDeclaredFields();//可以访问公共、默认、保护、私有。但是不包括继承
//
// for (Field field : fields) { //遍历查看属性的顺序 进行依次赋值
// System.out.println(field);
// }
//
// fields[0].setAccessible(fields, true); //设置数组的是否取消全校检查
//
// fields[0].set(p, 1);
// fields[1].set(p, "wxc");
//
// System.out.println(p);
/*1.3 通过反射调用方法 */
// Class clazz = Person.class;
// Person p = (Person)clazz.newInstance();
// Method method = clazz.getMethod("say", int.class,String.class);//获取指定方法,并传入参数的Class
// String result = (String)method.invoke(p, 1,"wxc");//调用say方法 == p.say(1 , wxc)
//
// System.out.println(result);
}
}