反射练习

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.itheima.bean.Person;

public class Test5 {

    /** * 5、定义一个标准的JavaBean,名叫Person,包含属性name、age。 * 使用反射的方式创建一个实例、调用构造函数初始化name、age, * 使用反射方式调用setName方法对名称进行设置, * 不使用setAge方法直接使用反射方式对age赋值。 * @param args * @throws IllegalAccessException * @throws InstantiationException * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws NoSuchFieldException */
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
        //定义Class 对象clazz 获取Person字节码文件
        Class clazz = Person.class;
        //获取构造函数
        Constructor c = clazz.getConstructor(String.class,int.class);
        //通过构造函数创建实例
        Person p = (Person)c.newInstance("顾雨磊",25);
        System.out.println("通过反射创建实例,并初始化!");
        System.out.println(p.getName()+"..."+p.getAge());

        //通过反射!调用setName方法对名称进行设置
        System.out.println("通过反射!调用setName方法对名称进行设置");
        //获取方法,参数类型带上
        Method m = clazz.getMethod("setName",String.class);
        m.invoke(p,"雨磊");
        System.out.println(p.getName()+"..."+p.getAge());

        //直接使用反射方式对age赋值
        //age 为私有成员变量 暴力反射 将私有设为可见 再改值
        System.out.println("直接使用反射方式对age赋值");
        Field f = clazz.getDeclaredField("age");
        f.setAccessible(true);
        f.set(p, 26);
        System.out.println(p.getName()+"..."+p.getAge());
    }

}

你可能感兴趣的:(反射)