所有 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 信息