访问构造方法

其实各个书上对于反射这块讲的都是很乱,看了几个大神博主的帖子之后顺序自己弄清了很多。

首先要介绍几种访问构造方法的方法,利用这种方法,将返回Constructor类型的对象或者数组

A.1:获取构造方法的数组:

 public Constructor<?>[] getConstructors():获得所有公共构造方法

    public Constructor<?>[] getDeclaredConstructors():获得所有构造方法

    示例:

         Constructor[] c1 = c.getConstructors();
         System.out.println(c1);// 返回的是地址值,证明得到的是个数组对象
         // 遍历这个数组
         for (Constructor ct : c1) {
             System.out.println(ct);
        }  //获得Person类中的所有公告构造方法
        // B:public Constructor<?>[] getDeclaredConstructors():获得所有构造方法
         Constructor[] c1 = c.getDeclaredConstructors();
         //遍历数组
         for(Constructor ct : c1){
            System.out.println(ct);
         } //获得Person类的所有构造方法

 

  A.2:获取单个构造方法(用于非私有的构造方法)

public Constructor<T> getConstructor(Class<?>... parameterTypes)

      参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象

    

  A.3:获取单个构造方法(用于私有的构造方法)

    

public Constructor<T> getDeclaredtConstructor(Class<?>... parameterTypes)
Constructor c1 = c.getDeclaredConstructor();
System.out.println(c1);

  获得带参构造方法:

Constructor c1 = c.getDeclaredConstructor(String.class,int.class,String.class); System.out.println(c1);

B.1:初始化构造方法的实例:(用于非私有的构造方法)    

public T newInstance(Object... initargs)  注意:T表示的是泛型,Object... initargs表示的是你要实例化的指定参数

      使用此 Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

  B.2:初始化构造方法的实例:(用于私有的构造方法)      

先用: public void setAccessible(boolean flag):flag的值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。

   再用: public T newInstance(Object... initargs) 

 通过反射获取公共带参构造方法并使用

//获取指定的构造方法,需要该方法的参数列表
        Constructor c1 = c.getDeclaredConstructor(String.class,int.class,String.class);
        System.out.println(c1);
        
        // 通过带参构造方法对象创建对象
        // public T newInstance(Object... initargs):
        //有泛型,前面没使用泛型,先用Objcet
        Object b = c1.newInstance("张三",13,"家乡");
        System.out.println(b); //Person [name=张三, age=13, address=家乡]

通过反射获取私有带参构造方法并使用

//获取指定的私有构造方法
        Constructor c1 = c.getDeclaredConstructor(String.class);
        
        //public void setAccessible(boolean flag):
        //flag的值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
        c1.setAccessible(true);
        
        // public T newInstance(Object... initargs) 
        Object ob = c1.newInstance("张三");
        System.out.println(ob);

java.lang.reflect包的描述

 

提供类和接口,以获得关于类和对象的反射信息。在安全限制内,反射允许编程访问关于加载类的字段、方法和构造方法的信息,并允许使用反射字段、方法和构造方法对其底层对等项进行操作。

如果必需的 ReflectPermission 可用,则 AccessibleObject 允许抑制访问检查。

Array 提供动态创建和访问数组的静态方法。

此包中的类以及 java.lang.Class 可以适应以下应用程序的需要:调试程序、解释程序、对象检查程序、类浏览程序,以及服务(比如,Object Serialization 和 JavaBean,它们需要访问目标对象(基于其运行时类)的公共成员或给定类声明的成员)。

 

从以下版本开始:JDK1.1

 

 

众所周知,所有Java类均继承了Object类,在Object类中定义了一个getClass()方法,该方法返回一个类型为Class的对象。利用Class类返回的对象,我们可以访问该返回对象的描述信息。

通过反射可访问的主要描述信息
组成部分访问方法返回值类型说明
包路径getPackage()Package对象获得该类的存放路径
类名称getName()String对象获得该类的名称
继承类getSuperclass()Class对象获得该类的继承类
实现接口getInterfaces()Class型数组获得该类实现的所有接口
 getConstructors()Constructor型数组获得所有权限为public的构造方法
 getConstrucor(Class<?>..parameterTypes)Constructor对象获得权限为public的指定构造方法
构造方法getDeclaredConstructors()Constructor型数组获得所有构造方法,按声明顺序返回
 getDeclaredConstructor(Class<?>..parameterTypes)Constructor对象获得指定构造方法
 getMethods()Method型数组获得所有权限为public的方法
 getMethods(String name,Class<?>...parameterTypes)Method对象获得权限为public的指定方法
方法getDeclaredMethods()Method型数组获得所有方法,按声明顺序返回
 getDeclaredMethod(String name,Class<?>...parameterTypes)Method对象获得指定方法
 getFields()Field型数组获得所有权限为public的成员变量
 getField(String name)Field对象获得权限为public的指定成员变量
成员变量getDeclaredFields()Field型数组获得所有成员变量,按声明顺序返回
 getDeclaredField(String name)Field对象获得指定成员变量
内部类getClass()Class型数组获得所有权限为public的内部类
 getDeclaredClass()Class型数组获得所有内部类
内部类的声明类getDeclaringClass()Class对象如果该类为内部类,则返回它的成员类,否则返回null

 

 

 

 

 

 

 

访问构造方法

有上表可以看出,通过一组访问方法来访问构造方法是,将返回Constructor类型的数组或对象。每个Constructor对象代表一个构造方法,利用Constructor对象可以操作相应的构造方法。

 

Constructor类常用方法
方法说明
isVarArgs()查看该构造方法是否允许带有可变数量的参数,如果允许则返回true,否则返回false
getParameterTypeset()按照声明顺序以Class数组的形式获得该构造方法的各个参数的类型
getExceptionTypes()以Class数组的形式获得该构造方法可能抛出的异常类型
newInstance(Object....initatgs)通过该构造方法利用指定的参数创建一个该类的对象,如果未设置参数则表示采用默认无参数的构造方法
setAccessible(boolean flag)如果该构造方法的权限为private,默认为不允许通过反射利用newInstance(Object...initargs)方法创建对象。
如果先执行该方法,并将入口参数设置为true,则允许创建
getModifiers()获得可以解析出该构造方法所采用修饰符的整数。

 

通过java.lang.reflect.Modifier类可以解析出getModifiers()方法的返回值所表示的修饰符信息,在该类中提供了一系列用来解析的静态方法,既可以查看是否被指定的修饰符修饰,还可以以字符串的形式获得所有修饰符。

 

Modifier类中的常用方法解析
静态方法说明
isPublic(int mod)查看是否被public修饰符修饰,如果是则返回true,否则返回false
isProtected(int mod)查看是否被protected修饰符修饰,如果是则返回true,否则返回false
isPrivate(int mod)查看是否被private修饰符修饰,如果是则返回true,否则返回false
isStatic(ing mod)查看是否被static修饰符修饰,如果是则返回true,否则返回false
isFinal(int mod)查看是否被final修饰符修饰,如果是则返回true,否则返回false
isString(int mod)以字符串的形式返回所有修饰符
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值