Java反射 之 反射基础(2)

public static void createObject() throws Exception{
        Class c4=Class.forName("com.linuxidc.org.base.relfect.Person");
        //使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例
        //public T newInstance(Object... initargs);
        // Person person=new Person()
        Constructor cs3=c4.getConstructor();//获取公共的无参构造方法的Constructor对象
        Object obj=cs3.newInstance();
       
        //Person person=new Person("linuxidc", 21, "北京");
        Constructor cs4=c4.getConstructor(String.class,int.class,String.class);
        Object obj1=cs4.newInstance("linuxidc",21,"北京");
        System.out.println(obj1);//Person [name=linuxidc, age=21, address=北京]
       
        //实例化一个私有的构造函数 private Person(String name)
        //控制java的访问检查
        //public void setAccessible(boolean flag)
        //将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
        //值为 false 则指示反射的对象应该实施 Java 语言访问检查。
        Constructor cs5=c4.getDeclaredConstructor(String.class);
        cs5.setAccessible(true);
        Object obj2=cs5.newInstance("张三丰");
        System.out.println(obj2);//Person [name=张三丰, age=0, address=null]
    }

四、java.lang.reflect.Field

1、获取Field对象

//获取Class类的Field对象
    public static void getFieldTest() throws Exception{
        Class cs=Class.forName("com.linuxidc.org.base.relfect.Person");
        //1、public Field[] getFields() throws SecurityException
        //获取Class 对象所表示的类或接口的所有可访问公共(public修饰的)字段
        Field [] fs=cs.getFields();
        //2、public Field[] getDeclaredFields() throws SecurityException
        // 获取Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段
        Field [] fs1=cs.getDeclaredFields();
        //3、public Field getField(String name)throws NoSuchFieldException, SecurityException;
        //获取Class 对象所表示的类或接口的指定公共成员(public修饰)字段。name 参数是一个 String,用于指定所需字段的简称
        Field fs2=cs.getField("address");
        //public Field getDeclaredField(String name)  throws NoSuchFieldException,SecurityException
        //获取 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称
        Field fs3=cs.getDeclaredField("name");
        System.out.println(fs3);
    }

2、通过Field对象对指定类属性赋值

//使用 Field对象
    public static void createVarValue() throws Exception{
        Class cs=Class.forName("com.linuxidc.org.base.relfect.Person");
        Object obj=cs.getConstructor().newInstance();
        Field addressField=cs.getField("address");
        //public void set(Object obj, Object value);
        //将指定对象变量上此 Field 对象表示的字段设置为指定的新值。如果底层字段的类型为基本类型,则对新值进行自动解包
        //obj - 应该修改其字段的对象  value - 正被修改的 obj 的字段的新值
        addressField.set(obj, "北京");
        System.out.println(obj); //Person [name=null, age=0, address=北京]
       
        //对非public修饰的变量操作
        Field nameField=cs.getDeclaredField("name");
        //控制java的访问检查
        nameField.setAccessible(true);
        nameField.set(obj, "张三丰");
        System.out.println(obj);//Person [name=张三丰, age=0, address=北京]
    }

五、java.lang.reflect.Method

1、获取Method对象

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/084df29c1974c16f725d0cc4c29b8023.html