• JAVA的反射机制学习笔记(二)


                 上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了。自己的步伐全然被打乱了~不能继续被动下去。得又一次找到自己的节奏。

    4、获取类的Constructor


    通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例 

    Class<T>类提供了几个方法获取类的构造器。

    public Constructor<T> getConstructor(Class<?

    >... parameterTypes)

    返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法

    public Constructor<?>[] getConstructors()

    返回一个包括某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的全部公共构造方法

    public Constructor<T> getDeclaredConstructor(Class<?

    >... parameterTypes)

    返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法

    public Constructor<?>[] getDeclaredConstructors()

    返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的全部构造方法。它们是公共、保护、默认(包)訪问和私有构造方法

    5、新建类的实例

    通过反射机制创建新类的实例,有几种方法能够创建

    调用无自变量ctor

    1、调用类的Class对象的newInstance方法。该方法会调用对象的默认构造器,假设没有默认构造器。会调用失败.

    Class<?> classType = ExtendType.class;

    Object inst = classType.newInstance();

    System.out.println(inst);

    输出:

    Type:Default Constructor

    ExtendType:Default Constructor

    com.quincy.ExtendType@d80be3

     

    2、调用默认Constructor对象的newInstance方法

    Class<?

    > classType = ExtendType.class;

    Constructor<?

    > constructor1 = classType.getConstructor();

    Object inst = constructor1.newInstance();

    System.out.println(inst);

    输出:

    Type:Default Constructor

    ExtendType:Default Constructor

    com.quincy.ExtendType@1006d75

    调用带參数ctor

    3、调用带參数Constructor对象的newInstance方法

    Constructor<?

    > constructor2 =

    classType.getDeclaredConstructor(int.class, String.class);

    Object inst = constructor2.newInstance(1, "123");

    System.out.println(inst);

    输出:

    Type:Default Constructor

    ExtendType:Constructor with parameters

    com.quincy.ExtendType@15e83f9

    class Dog {
        public String name;
        public int age;
        public int weigh;
        public void bark(String name){
            System.out.println(name);};
        public void run(){};
    
        Dog(){}
        Dog(String name) {
            this.name = name;
        }
        Dog(String name,int age) {
            this.name = name;
            this.age = age;
        }
    }

            // 取得字节码,这样的取法 更安全、更高效。
            Class clazzDog = Dog.class;
            System.out.println("-----------------Constructor-------------------");
            // 使用ggetDeclaredConstructors获取构造器
            Constructor<?

    >[] constructors2 = clazzDog.getDeclaredConstructors(); for (Constructor<?

    > m : constructors2) { System.out.println(m); Class<?

    >[] types = m.getParameterTypes(); for (Class<?

    > type : types) { System.out.println(type); } } System.out.println("-----------------new instance-------------------"); Constructor constructor = clazzDog.getDeclaredConstructor(String.class,int.class); Dog dog = (Dog)constructor.newInstance("换换",2); System.out.println(dog.name);

    -----------------Constructor-------------------
    com.reflection.Dog()
    com.reflection.Dog(java.lang.String)
    class java.lang.String
    com.reflection.Dog(java.lang.String,int)
    class java.lang.String
    int
    -----------------new instance-------------------
    换换

    6、调用类的函数

    通过反射获取类Method对象。调用Field的Invoke方法调用函数。

            // 取得字节码。这样的取法 更安全、更高效。
            Class clazzDog = Dog.class;
            Object object = clazzDog.newInstance();
            Method method = clazzDog.getDeclaredMethod("bark",String.class);
            method.invoke(object, "狗叫");
    狗叫

    7、设置/获取类的属性值

    通过反射获取类的Field对象,调用Field方法设置或获取值

            // 取得字节码。这样的取法 更安全、更高效。

    Class clazzDog = Dog.class; Object object = clazzDog.newInstance(); Field field = clazzDog.getDeclaredField("name"); field.set(object, "欢欢"); System.out.println(((Dog)object).name);

    欢欢




  • 相关阅读:
    你的系统需要做系统集成测试么?
    测试驱动 ASP.NET MVC 和构建可测试 ASP.NET MVC 应用程序
    RikMigrations 或 Migrator.NET 进行自动化的数据库升级
    单元测试
    C#反射
    J2EE--Struts2基础开发
    Dynamics CRM 客户端的插件调试
    于快速创建 IEqualityComparer<T> 实例的类 Equality<T>
    ToolBox Analysis & Design
    实现$.fn.extend 和$.extend函数
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5124217.html
Copyright © 2020-2023  润新知