1. public class Person {
  2. private String name;
  3. private int age;
  4. public Person() {
  5. super();
  6. }
  7. public Person(String name) {
  8. this.name = name;
  9. }
  10. public Person(int age) {
  11. this.age = age;
  12. }
  13. public Person(String name, int age) {
  14. super();
  15. this.name = name;
  16. this.age = age;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public int getAge() {
  25. return age;
  26. }
  27. public void setAge(int age) {
  28. this.age = age;
  29. }
  30. @Override
  31. public String toString() {
  32. return "Person [name=" + name + ", age=" + age + "]";
  33. }
  34. public void run() {
  35. System.out.println("跑步...");
  36. }
  37. private void run(int num) {
  38. System.out.println("跑步" + num + "公里...");
  39. }
  40. }

获取无参构造方法

  1. @Test
  2. public void demo1() throws Exception {
  3. Class clazz = Class.forName("cn.giteasy.common.Person");
  4. Person p = (Person) clazz.newInstance();
  5. System.out.println(p);
  6. }

Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数,就不能这样创建了.
可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance(“zhangsan”,18)方法创建对象

  1. public void demo2() throws Exception {
  2. Class clazz = Class.forName("cn.giteasy.common.Person");
  3. //获取有参构造。反射阶段,传入的参数也是字节码文件对象
  4. Constructor c = clazz.getConstructor(String.class,int.class);
  5. //通过有参构造创建对象
  6. Person p = (Person) c.newInstance("zhangsan",18);
  7. System.out.println(p);
  8. /**
  9. * 获取所有构造方法
  10. */
  11. Constructor[] constructors = clazz.getConstructors();
  12. for (Constructor constructor : constructors) {
  13. System.out.println(constructor);
  14. }
  15. /**
  16. * 输出
  17. * public cn.giteasy.common.Person(java.lang.String,int)
  18. * public cn.giteasy.common.Person(int)
  19. * public cn.giteasy.common.Person(java.lang.String)
  20. * public cn.giteasy.common.Person()
  21. */
  22. }

获取成员变量

Class.getField(String)方法可以获取类中的指定字段(可见的),通过set(obj, “李四”)方法可以设置指定对象上该字段的值

  1. @Test
  2. public void demo1() throws Exception {
  3. Class clazz = Class.forName("cn.giteasy.common.Person");
  4. Person p = (Person) clazz.newInstance(); //通过有参构造创建对象
  5. /**
  6. *获取姓名字段,
  7. * 如果属性是私有的,报java.lang.NoSuchFieldException,可使用getDeclaedField()方法
  8. */
  9. Field field = clazz.getField("name"); //ava.lang.NoSuchFieldException
  10. field.set(p, "李四"); //修改姓名的值
  11. System.out.println(p);
  12. }

如果是私有的可以用getDeclaedField(“name”)方法获取,如果是私有的需要先调用setAccessible(true)设置访问权限.

  1. @Test
  2. public void demo2() throws Exception {
  3. Class clazz = Class.forName("cn.giteasy.common.Person");
  4. Person p = (Person) clazz.newInstance(); //通过有参构造创建对象
  5. Field f = clazz.getDeclaredField("name"); //暴力反射获取字段
  6. f.setAccessible(true); //去除私有权限
  7. f.set(p, "李四");
  8. /**
  9. * 输出结果:
  10. *
  11. * Person [name=李四, age=0]
  12. */
  13. System.out.println(p);
  14. //用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值
  15. Object fieldValue = f.get(p);
  16. /**
  17. * 李四
  18. */
  19. System.out.println(fieldValue);
  20. }

获取成员方法

Class.getMethod(String, Class…) 和 Class.getDeclaredMethod(String,Class…)方法可以获取类中的指定方法,
invoke(Object,Object…)可以调用该方法

  1. Class.getMethod("eat").invoke(obj)
  2. Class.getMethod("eat",int.class).invoke(obj,10)
  1. @Test
  2. public void demo1() throws Exception {
  3. Class clazz = Class.forName("cn.giteasy.common.Person");
  4. Person person = (Person) clazz.newInstance();
  5. Method method = clazz.getMethod("run"); //获取eat方法
  6. method.invoke(person);//跑步...
  7. /**
  8. * 如果方法是私有的,使用
  9. * Class.getDeclaredMethod(String,Class...)
  10. */
  11. Method method2 = clazz.getDeclaredMethod("run", int.class); //获取有参的eat方法
  12. method2.setAccessible(true);
  13. method2.invoke(person, 100);//跑步100公里...
  14. }