美文网首页
反射获取构造方法ReflectCall

反射获取构造方法ReflectCall

作者: 勇者与王者 | 来源:发表于2019-10-08 00:06 被阅读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);
    
    
    
    
        }
    }
    
    

    相关文章

      网友评论

          本文标题:反射获取构造方法ReflectCall

          本文链接:https://www.haomeiwen.com/subject/ujyvpctx.html