第十六章 反射与注解

所有 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 类中的所有构造方法造构造方法是否允许带有可变数量的参数、入口参数类型和可能抛出的异常类型信息输出到控制台:

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]反射一个类的所有成员变量

16.2Annotation注解功能

@override  限定重写父类方法

@suppresswarnings   抑制编译器警告 

@deprecated   标示已过时 

16.4创建自定义的注解16.2.2访问Annotation 信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值