`
zhwayne
  • 浏览: 17517 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA反射机制入门(一)--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());
      
    }
}
0
0
分享到:
评论

相关推荐

    JAVA反射机制-Class类-Class对象的获取.pdf

    JAVA反射机制-Class类-Class对象的获取.pdf

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    根据这个字符串获得某个类的Class实例,这样就可以动态配置一些东西,不用每一次都要在代码里面去new或者做其他的事情,以后要改的话直接改配置文件,代码维护起来就很方便了,同时有时候要适应某些需求,Java类里面...

    Java反射机制总结

    这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。... 关键字有:Java Java反射机制 Java反射 Java反射理论 Java反射实例 Java反射例子 反射原理 反射 网络论文 集合 汇总 总结 Class。

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    使用JAVA反射机制动态调用 计算器对象的加法,减法函数。 使用JAVA反射机制修改一个学生对象 的私有数据成员(不允许调用setters) 使用的类有Class, Method, Field

    java-class-api

    Controls whether or not the event is sent back down to the peer once the source has processed it - false means it's sent to the peer; true means it's not. Semantic events always have a 'true' value ...

    java反编译软件--查看class文件

    很小的工具,操作方便,java反编译软件--查看class文件。

    classgraph-4.8.83-API文档-中英对照版.zip

    包含翻译后的API文档:classgraph-4.8.83-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:io.github.classgraph:classgraph:4.8.83; 标签:github、classgraph、jar包、java、中英对照文档; 使用方法:...

    Java基础[08-反射].ppt

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...

    aws-java-sdk-s3-1.12.384.jar中文-英文对照文档.zip

    # 含有的 Java class(类)(此处仅列举3个): ``` com.amazonaws.auth.AwsChunkedEncodingInputStream com.amazonaws.auth.policy.actions.S3Actions com.amazonaws.auth.policy.conditions.S3ConditionFactory .....

    java反射机制的ppt

    什么是反射 Class类的介绍 如何用Class类获得类的构造方法、成员属性、成员方法 利用java反射机制动态创建对象 利用java反射机制动态调用成员方法和改变成员变量

    java反射机制知识点

    java反射机制基础学习。Class、Method、Field

    JAVA反射机制详解视频

    (类的加载概述和加载时机) (类加载器的概述和分类) (获取class文件对象的三种方式) ...(通过反射写一个通用的设置某个对象的某个属性为指定的值) (通过用户的增删改查和学生的登录注册引出中介) (动态代理的概述和实现)

    classgraph-4.8.90-API文档-中文版.zip

    包含翻译后的API文档:classgraph-4.8.90-javadoc-API文档-中文(简体)版.zip; Maven坐标:io.github.classgraph:classgraph:4.8.90; 标签:github、classgraph、中文文档、jar包、java; 使用方法:解压翻译后的...

    Java反射机制知识

    里面主要是介绍Java反射的只是,包括介绍Class类的初始化,如何通过反射动态加载类和获取类的信息等。

    java-spring-boot-restful-api:杂志 API - 宁静的 API 示例

    java-spring-boot-restful-api Magazine API - 宁静的 API 示例。 堆 Java 8 日本特许经营协会 弹簧靴 JUnit - Mockito Gradle 先决条件 JDK 1.8 等级 2.2.1 任何 REST 客户端(如 XHR 海报) 可选:GGTS(或...

    mysql-connector-java-commercial-5.1.30-bin.jar

    C:\Program Files\Apache Software Foundation\Tomcat5.5\common\lib\servlet-api.jar;%JAVA_HOME%\lib\mysql-connector-java-5.1.30-bin-g.jar;C:\Program Files\Java\mysqlforjdbc\mysql-connector-java-5.1.30-...

    Java基础 反射篇.md

    Java基础 反射篇 - Java基础 反射篇 - 反射的思想及作用 - 反射的基本使用 - 获取类的 Class 对象 - 构造类的实例化对象 - 获取一个类的所有信息 - 获取类中的变量(Field) - 获取类中的方法(Method) - ...

    java反射机制讲解与应用举例

    关于java反射机制的很好的讲解,包括Java的反射机制(Reflection)、Class类、如何获得类的相关信息和运用,并且还有相应的练习,有助于更好地学习java反射机制

    Java反射机制——类的加载方法,创建对象,获取方法以及结构

    一、java反射机制概述 Reflection (反射)被视为动态语言的关键,为什么这么说呢,是因为它在运行时就确定下来了。反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的...

Global site tag (gtag.js) - Google Analytics