第十六章 反射与注解

所有 Java 类均继承了 bjet 类,在 Object 类中定义了一个 getClass0方法,该回一个类型为Class的对象。例如下面的代码:

JTextField textField = new JTextField();//创建JTextField对象
Class textFieldC = textField.getClass();//获取Class对象
利用Class类的对象textFieldC,可以访问用来返回该对象的 textField 对象的描述信息。可的主要描述信息如表16.1所示。

16.1.1访问构造方法
在通过下列一组方法访问构造方法时,将返回Constructor类型的对象或数组。每个Constructor对象代表一个构造方法,利用Constructor 对象可以操纵相应的构造方法:

1,getConstructors0)
2,getConstructor(Class<?>...parameterTypes)

3,getDeclaredConstructors0)

4,getDeclaredConstructor(Class<?>...parameterTypes)。

如果是访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。例如,访问一个入口参数类型依次为 String 型和 nt 型的构造方法,通过下面两种方式均可实现:

objectClass.getDeclaredConstructor(String.class, int.class);
objectClass.getDeclaredConstructor(new Classl[] {String.class, int.clas };


例如,判断对象constructor 所代表的构造方法是否被 private 修饰,以及以字符形式获的该构造方
法的所有修饰符的典型代码如下:

int modifiers = constructor.getModifiers();
boolean isEmbellishByPrivate = Modifier.isPrivate(modifiers);
String embellishment = Modifier.toString(modifiers):
[例16.1]反射一个类的所有构造方法

ConstructorDemol,在该类中通过反射访间 com.mrDemol 类中的所有构造方法造构造方法是否允许带有可变数量的参数、入口参数类型和可能抛出的异常类型信息输出到控制台:

 

  1. import java.lang.reflect.Constructor;
     
        import com.mr.Demo1;
     
        public class ConstructorDemo1 {
     
            public static void main(String[] args) {
                Demo1 d1= new Demo1("10","20","30");
                Class<? extends Demo1> Demo1Class = d1.getClass();
                //获得所有构造方法
                Constructor[] declaredConstructors = 
                        Demo1Class.getDeclaredConstructors();
                for (int i= 0; i < declaredConstructors.length; i++){//遍历构造方法
                    Constructor<?> constructor = declaredConstructors[i];
                        System.out.println("查看是否允许带有可变数量的参数:" +constructor.isVarArgs());
                        Class[] parameterTypes = constructor.getParameterTypes(); //获取所有参数类型
                        for (int j= 0; j< parameterTypes.length; j++) {
                                System.out.println(""+ parameterTypes);}
                        System.out.println("该构造方法可能抛出的异常类型为:");
                        //获得所有可能抛出的异常信息类型
                        Class[] exceptionTypes = constructor.getExceptionTypes();
                        for (int j = 0; j< exceptionTypes.length; j++) {
                                System.out.println(""+ exceptionTypes[i]);
                        }
                        Demo1 d2 = null;
                        while(d2 == null) {
                            try{//如果构造方法的访问权限为 private或 protected,则抛出异常,即不允许访问
                                if(i==2)//通过执行默认没有参数的构造方法创建对象
                                    d2 =(Demo1) constructor.newInstance();
                                    else if(i==1)
                                    //请过执行具有两个参数的构造方法创建对象
                                        d2 =(Demo1)constructor.newInstance("7",5);
                                    else {//通过执行具有可交数最参数的构造方法创建对象
                                        Object[] parameters = new Object[] {new String[] {"100","200","300"}};
                                        d2 =(Demo1) constructor.newInstance(parameters);
                                    }
                            }catch(Exception e) {
                                System.out.println("在创建对象时抛出异常,下面执行setAccessible()方法");
                                constructor.setAccessible(true);
                            }
                        }
                        if(d2 != null) {
                            d2.print();
                            System.out.println();
                        }
                }
            }
        }

    16.1.2 访间成员变量
    通过下列一想方法访问成员变量时,将返回Field类型的对象或数组,每个Field 对象代表一个成员变量:

    getFields0)
    getField(String name)
    getDeclaredFields().
    getDeclaredFicld(String name)
    如果是访问指定的成员变,可以通过该成员变量的名称来访问。例如,访问一个名称为brithday访问方法如下

    object. getDeclaredField("birthday");
     [例16.2]反射一个类的所有成员变量

  2. 16.2Annotation注解功能

    @override  限定重写父类方法

    @suppresswarnings   抑制编译器警告 

    @deprecated   标示已过时 

    16.4创建自定义的注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值