JAVA反射机制入门(一)--Class类API实例介绍

本文通过实例详细介绍了JAVA反射机制中java.lang.Class类的API用法,包括获取内部类、属性、构造器等操作,适合初学者。

本文针对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());
       
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值