反射获取构造方法ReflectCall

2019-10-08  本文已影响0人  勇者与王者
package Day32_Reflection;

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

/**
 * @Author quzheng
 * @Date 2019/10/7 21:34
 * @Version 1.0
 *
 * 获取Class文件对象
 * 反射来调用类的方法和成员
 *
 * 反射获取构造方法并运行,有快捷的方式:
 *  前提是:被反射的类,必须有 公有的空参  构造方法
 *
 *  反射获取 私有构造方法
 *  不推荐,破坏封装性和安全性
 *
 */
public class ReflectCall {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class c = Class.forName("Day32_Reflection.Person");

        //使用class文件
        // getConstructors()  获取class文件对象中的所有公共构造器
//        Constructor[] cons = c.getConstructors();
//        for(Constructor con : cons){
//            System.out.println(con);
//        }

        // 获取指定的构造方法
        Constructor con1 = c.getConstructor();
        System.out.println(con1);

        //运行 获取到的空参数构造方法 newInstance()
        Object o = con1.newInstance();
        System.out.println(o);      //生成的是Person类的实例

        // 获取有参数的构造方法
        // Constructor<T> getConstructor(Class<?>...parameterTypes)
        Constructor con2 = c.getConstructor(String.class,int.class);
        System.out.println(con2);

        //传递实际参数
        Object o1 = con2.newInstance("张三",20);
        System.out.println(o1);

        // Class类中定义了方法 T newInstance() 直接创建被反射的类的对象实例
        // 已经不建议使用了好像
        Object o2 = c.newInstance();
        System.out.println(o2);

        // getDeclaredConstructors() 获取所有 包括私有的构造器
        Constructor[] cons1 = c.getDeclaredConstructors();
        for(Constructor con : cons1){
            System.out.println(con);
        }

        // 只获取 私有构造器 Constructor getDeclaredConstructor(Class...c)
        Constructor con3 = c.getDeclaredConstructor(int.class,String.class);
        System.out.println(con3);
        // 试图访问私有构造器,会抛出 非法访问异常
        Object o3 = con3.newInstance(18,"lisi");

        // 此时可以使用 Constructor的父类 AccessibleObject的方法
        // setAccessible(boolean b)
        // 参数为true 则 指示 反射的对象在使用时,取消 访问检查
        con3.setAccessible(true);

        Object o33 = con3.newInstance(18,"lisi");

        System.out.println(o3);




    }
}

上一篇下一篇

猜你喜欢

热点阅读