示例类代码:
package JavaDay_5_26.JavaReflection; /** * @author [email protected] * @date 18-5-26 上午9:59 */ public class Person { private String name; private int age; private String sex; public Person() { name = ""; age = 0; sex = "man"; } private Person(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } 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; } }
Demo类代码:
package JavaDay_5_26.JavaReflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author [email protected] * @date 18-5-26 上午9:54 */ public class Demo1 { public static void main(String[] args) { String className = "JavaDay_5_26.JavaReflection.Person"; try { //获取Person类对象 Class classPerson = Class.forName(className); //通过Person类的无参构造函数创建person1对象 Object person1 = classPerson.newInstance(); System.out.println(person1); //通过Person类的私有有参函数创建person2对象 Constructor constructor1 = classPerson.getDeclaredConstructor(String.class, int.class, String.class); constructor1.setAccessible(true); Object person2 = constructor1.newInstance("vina", 21, "man"); System.out.println(person2); //获取Person类的toString方法,并调用此方法 Method method1 = classPerson.getMethod("toString"); System.out.println(method1.invoke(person2)); //获取Person类的私有字段 Field nameField = classPerson.getDeclaredField("name"); nameField.setAccessible(true); System.out.println("name = " + nameField.get(person2)); nameField.set(person2, "myvina"); System.out.println("name = " + nameField.get(person2)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }
测试结果:
总结:初步尝试了Java反射机制的强大,也对反射机制有了初步的认识。Java反射就是动态获取某类的方法、字段和构造函数等,并对其进行调用或访问。