美文网首页
反射获取构造方法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

  • java 反射学习笔记(四)反射的基本操作和用法

    反射的基本操作和用法: 通过反射获取该类的属性;通过反射获取该类的方法;通过反射获取该类的构造方法; 在通过反射获...

  • 2020-07-04【反射】

    类加载 类加载器 反射概述 获取Class类的对象 反射获取构造方法并使用 反射获取成员遍历并使用 反射获取成员方...

  • java 反射

    什么是反射 反射的作用 反射的应用场景 获取Class对象 获取属性 5.获取方法 6.获取构造 7.创建对象 8...

  • android中如何clone没有实现cloneable的对象?

    方法1:反射获取构造函数,然后依次反射赋值属性 缺点1:构造函数可能包含复杂的参数,不容易模拟参数,而且构造函数可...

  • java基础(一)反射注解泛型

    反射 1.反射拿到构造函数 2.通过构造去创建对象 3.反射获取属性修改属性 4.反射执行私有方法 注解 1.Re...

  • java反射和动态代理

    java反射 反射是程序运行时,通过反射直接操作对象或者类。获取类声明的属性和方法,调用方法或者构造对象,设置修改...

  • java高级编程-反射获取方法、属性、构造(附源码解析)

    java高级编程-反射获取方法、属性、构造 准备bean 获取对象对应的类对象 见博客:https://blog....

  • 反射

    反射的作用① 动态的加载类、动态的获取类的信息(属性,方法,构造方法) ② 动态构造对象 ③ 动态调用类和对象的任...

  • Java反射API

    Java反射API Java反射机制提供的功能 获取一个类的所有成员变量及方法(含构造方法(有/无 参数)) 创建...

网友评论

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

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