您的位置 首页 java

Java 17 Reflection 反射 Constructor 篇

java 17 Reflection 反射 Constructor

上一篇已经说过反射中 Class 相关的知识点, 这次来说说构造器(Constructor)相关的使用。

对于 constructor 构造器, 主要是提供了 构造函数 相关的单个构造函数的相关信息以及对应的访问方法。

构造器的定义:

 public final class Constructor<T>  extends  Executable  

最基础的用法, 调用默认的构造函数:

 import  Java .lang.reflect.Constructor;

public class C01 {
    public static  void  main(String[] args) throws  Exception  {
        Class<?> clazz = Class.forName("ConstructorTest");
        Constructor constructor = clazz.getDeclaredConstructor();
        System.out.println(constructor);
        Object obj = constructor.newInstance();
        System.out.println(obj);
    }

}

class ConstructorTest {
    // 为了方便查看效果,重载默认的 构造方法 
    public ConstructorTest() {
        System.out.println("默认的构造方法!");
    }

    @Override
    public String toString() {
        return "ConstructorTest.toString()";
    }
}  

既然构造方法, 就有无参和有参, 上面演示了无参的默认构造方法,如果有参数的

根据这个方法定义可以看到:

 public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
        throws NoSuchMethodException, SecurityException  

对应的 parameterTypes 是个可变参数。并且显式的抛出 2 个异常。返回了 Constructor 对象。

对于构造器对象的相关方法如下:

基础的使用方式, 就是 toString (),toGenericString(), hashCode(),getName(),getModifiers()。

toString(): 返回一个描述此构造函数的字符串。默认返回父类的 toString 方法, 除非重载了方法。

 System.out.println(constructor.toString());  

toGenericString(): 返回描述此构造函数的字符串,包括类型参数。

 System.out.println(constructor.toGenericString());  

对于 hashCode 的方法,是返回对应的哈希码散列值。

getName(): 可以获得构造函数的名字, 以字符串返回。

 System.out.println(constructor.getName());  

getModifiers: 获得 Java 语言的修饰符。并且使用整数进行存储。返回值如下:

Java 中的 0x 开头的是代表使用的十六进制进行标识。

对于 getModifiers 方法, 继承的来源是: java.lang .reflect.Member 接口。

对于 Field 和 Method 都实现了或者间接的实现了该方法。

以上的完整代码如下:

构造函数参数相关

构造函数的参数

通过 getParameterCount 方法, 获得构造方法的参数个数。

 Constructor conNo = clazz.getDeclaredConstructor();
System.out.println("无参构造方法: " + conNo.getParameterCount());  

当然也可以使用多个参数的调用方式。

演示代码如下所示:

除了能够获得对应的构造参数个数, 也可以知道对应的参数类型数据。

当然除了这些还有一些判断函数。 比方说:isVarArgs() 函数,主要是用来判断对于执行的文件是不是可变参数,如果是可变参数返回 true, 否则就返回 false。

注解相关的

构造器中的注解参数获取

 import java.lang. Annotation .Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Constructor;

public class C07 {
    public static void main(String[] args) throws Exception {
        Constructor constructor = ConstructorTest.class.getDeclaredConstructor(String.class);
        Annotation[][] anns = constructor.getParameterAnnotations();
        for (Annotation[] as : anns) {
            for (Annotation a : as) {
                System.out.println(a);
                System.out.println(((Test) a).value());
            }
        }
    }
}

class ConstructorTest {
    @Test(" 默认构造函数 ")
    ConstructorTest(@Test(value = "name 的值") String name) {
    }
}

@Target(value = { ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER,ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@interface Test {
    String value() default "";
}  

对于构造器来说, 相对来说就是怎么调用构造器, 怎么根据构造器的定义进行访问和获取。

当然对于构造函数对象依然可以重新活动对应的类对象。 可以使用 getDeclaringClass() 方法。

代码演示如下:

对于编程语言来说, 很多知识点都是通用的, 在学习其他的知识点的时候, 都是对已学知识点的加深和巩固。比方说 Java 中的修饰符, 在 Java 编程语言 规范中就是定义的一系列的魔法值,在学习 Java 到一定的程度的时候, 就可以去看看 Java 语言规范以及 Java 虚拟机 规范。这样的对于你在理解 Java 如何使用的基础上,进阶为知道为何这样使用。

就像抽象类 Executable 继承的 AccessibleObject 类,第一次学习就把它吃透了。 知道它是 Field、Method、Constructor 对象的基类, 这些对象都是反射对象。你要做的就是验证这些知识是不是和你想的一样。 如果一样, 说明设计方式和你理解的一致, 否则就去学习别人为何这样做。 查看这些类的 API 你会发现定义中就可以看到 Field 就直接继承了 AccessibleObject 类。

 public final class Field extends AccessibleObject implements Member  

该类主要提供了在 Java 语言访问控制防止在其顶级类之外使用私有变量,包外的包访问成员。以及受保护的成员信息。

所以基于以上的知识点, 在学习 Field、Method 相关操作也一定有如上的方法供我们使用。

反射知识点构造器篇就先说到这了。 接下来重新开一篇,再来聊聊属性(Field)和方法(Method)。元旦的最后一天, 都吃好玩好。

文章来源:智云一二三科技

文章标题:Java 17 Reflection 反射 Constructor 篇

文章地址:https://www.zhihuclub.com/176533.shtml

关于作者: 智云科技

热门文章

网站地图