public class Person {private String name;private int age;public Person() {super();}public Person(String name) {this.name = name;}public Person(int age) {this.age = age;}public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}public void run() {System.out.println("跑步...");}private void run(int num) {System.out.println("跑步" + num + "公里...");}}
获取无参构造方法
@Testpublic void demo1() throws Exception {Class clazz = Class.forName("cn.giteasy.common.Person");Person p = (Person) clazz.newInstance();System.out.println(p);}
Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数,就不能这样创建了.
可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance(“zhangsan”,18)方法创建对象
public void demo2() throws Exception {Class clazz = Class.forName("cn.giteasy.common.Person");//获取有参构造。反射阶段,传入的参数也是字节码文件对象Constructor c = clazz.getConstructor(String.class,int.class);//通过有参构造创建对象Person p = (Person) c.newInstance("zhangsan",18);System.out.println(p);/*** 获取所有构造方法*/Constructor[] constructors = clazz.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}/*** 输出* public cn.giteasy.common.Person(java.lang.String,int)* public cn.giteasy.common.Person(int)* public cn.giteasy.common.Person(java.lang.String)* public cn.giteasy.common.Person()*/}
获取成员变量
Class.getField(String)方法可以获取类中的指定字段(可见的),通过set(obj, “李四”)方法可以设置指定对象上该字段的值
@Testpublic void demo1() throws Exception {Class clazz = Class.forName("cn.giteasy.common.Person");Person p = (Person) clazz.newInstance(); //通过有参构造创建对象/***获取姓名字段,* 如果属性是私有的,报java.lang.NoSuchFieldException,可使用getDeclaedField()方法*/Field field = clazz.getField("name"); //ava.lang.NoSuchFieldExceptionfield.set(p, "李四"); //修改姓名的值System.out.println(p);}
如果是私有的可以用getDeclaedField(“name”)方法获取,如果是私有的需要先调用setAccessible(true)设置访问权限.
@Testpublic void demo2() throws Exception {Class clazz = Class.forName("cn.giteasy.common.Person");Person p = (Person) clazz.newInstance(); //通过有参构造创建对象Field f = clazz.getDeclaredField("name"); //暴力反射获取字段f.setAccessible(true); //去除私有权限f.set(p, "李四");/*** 输出结果:** Person [name=李四, age=0]*/System.out.println(p);//用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值Object fieldValue = f.get(p);/*** 李四*/System.out.println(fieldValue);}
获取成员方法
Class.getMethod(String, Class…) 和 Class.getDeclaredMethod(String,Class…)方法可以获取类中的指定方法,
invoke(Object,Object…)可以调用该方法
Class.getMethod("eat").invoke(obj)Class.getMethod("eat",int.class).invoke(obj,10)
@Testpublic void demo1() throws Exception {Class clazz = Class.forName("cn.giteasy.common.Person");Person person = (Person) clazz.newInstance();Method method = clazz.getMethod("run"); //获取eat方法method.invoke(person);//跑步.../*** 如果方法是私有的,使用* Class.getDeclaredMethod(String,Class...)*/Method method2 = clazz.getDeclaredMethod("run", int.class); //获取有参的eat方法method2.setAccessible(true);method2.invoke(person, 100);//跑步100公里...}
