本文针对jdk6.0中java.lang.Class类的API进行了简单的实例应用,例子简单易懂,比较适合入门级阅读。
实例简介:
/*
*IncludeInnerClass类中包含了三种访问控制的内部类,并且以这三个内部类的引用对象和一个整型数作为属性,在外部类的方法中分别调用了 内部类的方法
*外部类有两个构造方法,一个默认构造方法,一个带一个整型参数的构造方法
*Class类的API大家可以直接查阅jdk手册
*getMethods()系列方法基本与getConstructors()系列方法类似,仅在后序文章中对getMethods()系列方法的一个特例做深入介绍,将涉及covariant return type 和bridge methods。
*/
package classTest;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
class IncludeInnerClass implements Runnable{
class DefaultInnerClass{
int i;
public DefaultInnerClass(){}
DefaultInnerClass(int i){
this.i = i;
}
void innerMethod(){
System.out.println("I am DefaultInnerClass.");
}
}
private class PrivateInnerClass{
int i;
PrivateInnerClass(){}
PrivateInnerClass(int i){
this.i = i;
}
void innerMethod(){
System.out.println("I am PrivateInnerClass.");
}
}
public class PublicInnerClass{
int i;
public PublicInnerClass(){}
PublicInnerClass(int i){
this.i = i;
}
void innerMethod(){
System.out.println("I am PublicInnerClass.");
}
}
DefaultInnerClass deic;
private PrivateInnerClass pric;
public PublicInnerClass puic;
int i;
public IncludeInnerClass(){
deic = new DefaultInnerClass(1);
pric = new PrivateInnerClass(2);
puic = new PublicInnerClass(3);
this.i=10;
}
private IncludeInnerClass(int i){
deic = new DefaultInnerClass(1);
pric = new PrivateInnerClass(2);
puic = new PublicInnerClass(3);
this.i=i;
}
public void method(){
deic.innerMethod();
pric.innerMethod();
puic.innerMethod();
}
public void run(){
method();
}
}
public class GetInnerClassTest {
public static void main(String[] args) throws SecurityException{
//直接生成外部类的对象,并调用外部类的方法
IncludeInnerClass iic = new IncludeInnerClass();
System.out.println("regular use of outer class object.");
iic.method();
System.out.println("+++++++++++++++++++++++++++++++++++");
//如何生成内部类对象:必须通过外部类实例
IncludeInnerClass.DefaultInnerClass iicdic = iic.new DefaultInnerClass(2);
System.out.println("regular use of inner class object.");
System.out.println(iicdic.i);
iicdic.innerMethod();
System.out.println("+++++++++++++++++++++++++++++++++++");
//动态加载外部类并通过getDeclaredClasses()得到其包含的内部类名称
Class<?> clc = iic.getClass();
Class<?>[] classArray = clc.getDeclaredClasses();
System.out.println("print inner class name.");
for(int i=0;i<classArray.length;i++){
System.out.println(classArray[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//动态加载内部类,调用getDeclaringClass()得到其外部类
Class<?> clac = iicdic.getClass();
Class<?> outClass = clac.getDeclaringClass();
System.out.println("print outer class name.");
System.out.println(outClass.getName());//如果没有外部类则返回null,小心空指针异常
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到所在的包
Package pack;
pack = clc.getPackage();
System.out.println("print package name.");
System.out.println(pack.getName());
System.out.println(pack.equals(clac.getPackage()));//内部类和外部类的包名相同
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类继承的接口
Class<?>[] interfaceArray = clc.getInterfaces();
System.out.println("print interface name.");
for(int i=0;i<interfaceArray.length;i++){
System.out.println(interfaceArray[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类的属性
Field[] field = clc.getDeclaredFields();
System.out.println("print outer class fields");
for(int i=0;i<field.length;i++){
System.out.println(Modifier.toString(field[i].getModifiers())+" "+field[i].getType().getName()+" "+field[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类的指定属性
Field f = null;
try {
f = clc.getDeclaredField("pric");
} catch (NoSuchFieldException e) {
System.out.println("no such Field.");
}
System.out.println("print the field we want.");
System.out.println(Modifier.toString(f.getModifiers())+" "+f.getType().getName()+" "+f.getName());
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类的所有构造函数及其修饰符和参数:getDeclaredConstructors()得到所有的构造函数
Constructor<?>[] allConArray = clc.getDeclaredConstructors();
System.out.println("print all constructor of outer class.");
for(int i=0;i<allConArray.length;i++){
System.out.println("-----------------------------------");
System.out.println("print modifier and name");
System.out.println(Modifier.toString(allConArray[i].getModifiers())+" "+allConArray[i].getName());
System.out.println("print parameter type");
Class<?>[] caparam = allConArray[i].getParameterTypes();
for(int j=0;j<caparam.length;j++){
System.out.println(caparam[j].getName());
}
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到外部类所有public的构造函数:getConstructor()
Constructor<?>[] publicCon = clc.getConstructors();
System.out.println("print all public constructor of outer class.");
for(int i=0;i<publicCon.length;i++){
System.out.println(Modifier.toString(publicCon[i].getModifiers())+" "+publicCon[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到指定的外部类构造函数getDeclaredConstructor(Class<?>[]),形参为指定构造函数的参数类型数组
Class<?>[] parameterTypes = new Class[1];
parameterTypes[0] = int.class;
Constructor<?> con = null;
try {
con = clc.getDeclaredConstructor(parameterTypes);
} catch (NoSuchMethodException e) {
System.out.println("NO SUCH CONSTURCTOR!!!");
}
System.out.println("we want the constructor with one parameter.");
System.out.println(Modifier.toString(con.getModifiers())+" "+con.getName());
System.out.println(con.getParameterTypes()[0].getName());
System.out.println("+++++++++++++++++++++++++++++++++++");
//Method类与Constructor基本一致,这里不做介绍。
//Method[] getDeclaredMethods(),不包括继承而来的
//Method getDeclaredMethod(Class<?>[])
//Method[] getMethods()得到所有public方法,包括继承而来的
//得到内部类的属性,这里需要注意内部类会隐含一个外部类的final this引用属性,可以通过打印结果观察到
Field[] innerField = clac.getDeclaredFields();
System.out.println("print inner class fields");
for(int i=0;i<innerField.length;i++){
System.out.println(Modifier.toString(innerField[i].getModifiers())+" "+innerField[i].getType().getName()+" "+innerField[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//得到内部类的构造方法,仅实例getDeclaredConstructors()
Constructor<?>[] innerCon = clac.getDeclaredConstructors();
System.out.println("print all constructor of inner class.");
for(int i=0;i<innerCon.length;i++){
System.out.println(Modifier.toString(innerCon[i].getModifiers())+" "+innerCon[i].getName());
}
System.out.println("+++++++++++++++++++++++++++++++++++");
//实验用,看看得到的数组类和内部类的名称如何显示
Class<int[]> arrayClass = int[].class;
Class<IncludeInnerClass.DefaultInnerClass> innerClass = IncludeInnerClass.DefaultInnerClass.class;
System.out.println(arrayClass);
System.out.println(innerClass.getName());
}
}
本文通过实例详细介绍了JAVA反射机制中java.lang.Class类的API用法,包括获取内部类、属性、构造器等操作,适合初学者。
1457

被折叠的 条评论
为什么被折叠?



