Java反射机制点滴知识(2)

公共构造方法:public renxixao.Person(java.lang.String,int,java.lang.String)
公共构造方法:public renxixao.Person()
所有构造方法:public renxixao.Person(java.lang.String,int,java.lang.String)
所有构造方法:public renxixao.Person()
Person [name=null, age=0, address=null]
show

/*
 * 通过反射去获取该构造方法并使用:
 * public Person(String name, int age, String address)
 */
public class ReflectDemo2 {
    public static void main(String[] args) throws Exception {
        // 获取字节码文件对象
        Class c = Class.forName("renxixao.Person");
        // 获取带参构造方法对象
        // public Constructor<T> getConstructor(Class<?>... parameterTypes)
        Constructor con = c.getConstructor(String.class, int.class,
                String.class);
        // 通过带参构造方法对象创建对象
        // public T newInstance(Object... initargs)
        Object obj = con.newInstance("小明", 27, "北京");
        System.out.println(obj);
    }
}

Person [name=小明, age=27, address=北京]

通过反射获取私有构造方法并使用

/*
 * 需求:通过反射获取私有构造方法并使用
 * private Person(String name){}
 */
public class ReflectDemo3 {
    public static void main(String[] args) throws Exception {
        // 获取字节码文件对象
        Class c = Class.forName("renxixiao.Person");

// 获取私有构造方法对象
        // NoSuchMethodException:每个这个方法异常
        // 原因是一开始我们使用的方法只能获取公共的,下面这种方式就可以了。
        Constructor con = c.getDeclaredConstructor(String.class);

// 用该私有构造方法创建对象
        // IllegalAccessException:非法的访问异常。
        // 暴力访问
        con.setAccessible(true);// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。
        Object obj = con.newInstance("小明");
        System.out.println(obj);
    }
}

获取私有构造时必须设置 con.setAccessible(true) 否则出现 IllegalAccessException:非法的访问异常。

通过反射获取获取成员变量并使用

/*
 * 通过发生获取成员变量并使用
 */
public class ReflectDemo {
    public static void main(String[] args) throws Exception {
        // 获取字节码文件对象
        Class c = Class.forName("renxixiao.Person");

// 获取所有的成员变量
        Field[] fields = c.getFields(); // 获取全部的成员变量
        Field[] declaredFields = c.getDeclaredFields(); // 获取私有的成员变量
        for (Field field : fields) {
        System.out.println("公共的成员变量"+field);
        }
        for (Field field : declaredFields) {
            System.out.println("私有的成员变量"+field);
        }

// 通过无参构造方法创建对象
        Constructor con = c.getConstructor();
        Object obj = con.newInstance();

// 获取单个的成员变量
        // 获取address并对其赋值
        Field addressField = c.getField("address");
        // public void set(Object obj,Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
        addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京"
        System.out.println(obj);

// 获取name并对其赋值
        // NoSuchFieldException
        Field nameField = c.getDeclaredField("name");
        // IllegalAccessException
        nameField.setAccessible(true);
        nameField.set(obj, "小明");
        System.out.println(obj);

// 获取age并对其赋值
        Field ageField = c.getDeclaredField("age");
        ageField.setAccessible(true);
        ageField.set(obj, 27);
        System.out.println(obj);
    }
}

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

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