`
zhwayne
  • 浏览: 17730 次
  • 性别: 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
分享到:
评论

相关推荐

    JDBC_Java反射技术入门

    Java JDBC(Java Database Connectivity)是Java编程语言与各种数据库交互的一种标准接口,它允许Java程序通过JDBC API连接和操作数据库。在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行...

    Java SE编程入门教程 java反射机制(共16页).pptx

    Java SE编程入门教程涵盖了许多Java基础知识,其中包括对Java反射机制的讲解。反射是Java中一个强大的功能,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够实现一些灵活的功能,如动态加载类、...

    java反射机制

    - [Baeldung:Java反射入门](https://www.baeldung.com/java-reflection) - [Stack Overflow上的相关讨论](https://stackoverflow.com/questions/tagged/java-reflection) 总之,Java反射机制是理解Java动态特性的...

    Java反射基础入门,一篇就够啦

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。本文将详细介绍Java反射的基础知识,包括反射的基本概念、工作原理、使用方法及优缺点。 1. 反射的基本...

    java 官方API帮助文档

    Java官方API帮助文档是Java开发者不可或缺的参考资料,它详尽地介绍了Java平台标准版(Java SE)的各种类库、接口和方法。这份文档是开发者学习和理解Java编程语言的重要工具,帮助他们有效地利用Java的内置功能和...

    Java基础入门第三版-黑马练习题

    - **对象**:Java是一种面向对象的编程语言,一切皆对象,对象是类的实例,包含了数据(属性)和行为(方法)。 - **面向对象、跨平台性**:Java的跨平台特性得益于Java虚拟机(JVM),它允许Java程序在任何安装了...

    CoreJava(java入门教程总结)

    ### CoreJava(java入门教程总结) 本教程旨在为Java初学者提供一份全面且深入的基础学习资料。作为一门广泛应用于各类软件开发的语言,Java以其强大的功能、跨平台的能力以及丰富的类库支持,成为许多开发者首选的...

    JAVA入门-Object类、Class类

    在Java编程语言中,Object类和Class类是两个非常基础且重要的概念,它们构成了Java类层次结构的基础。让我们深入了解一下这两个关键概念。 首先,我们来谈谈Object类。Object类是所有Java类的顶级父类,无论是...

    java学习基础入门

    4. **类与对象**:Java是一种面向对象的语言,类是对象的模板,对象是类的实例。了解如何声明类、创建对象、封装数据成员和方法,以及如何使用构造函数是学习Java的重要部分。 5. **继承与多态**:Java支持单一继承...

    Java 2 入门与实例教程

    Java 2 入门与实例教程是一本专为初学者设计的编程指南,旨在帮助读者快速掌握Java语言的基础知识,并通过实例深入理解编程概念。Java作为一种广泛应用的编程语言,广泛应用于软件开发、移动应用、服务器端编程以及...

    Java入门学习笔记

    - **类(Class):** 类是Java中的一种抽象数据类型,它是对象的模板。 - **对象(Object):** 对象是类的一个实例,每个对象都拥有其独立的状态和行为。 - **方法(Method):** 方法是对一组相关操作的封装,用于完成...

    JAVA语言入门~~CHM

    7. **反射机制** - **Class类**:获取类的信息,如类名、方法、字段等。 - **动态代理**:在运行时创建一个实现了指定接口的新类。 8. **Java API和库** - **JDBC**:Java数据库连接,用于与各种数据库交互。 -...

    Java经典入门+笔记

    14. **反射机制**:通过Class类获取类的信息,动态创建对象,调用方法和访问字段。 15. **Java API的使用**:讲解Java标准库中的各种类和方法,如日期时间API、数学运算、集合操作等。 《Note of Java(Primer).doc...

    java程序设计入门

    14. **Java反射机制**:反射允许程序在运行时检查类的信息,创建和操作类的对象,是Java动态性的一个重要体现。 15. **JDBC数据库操作**:Java Database Connectivity(JDBC)是Java连接数据库的标准API,学习如何...

    java_JDK_实例开发宝典

    实例将解释如何使用Class类、Constructor类、Method类和Field类来实现反射。 9. **Java标准库**:Java的API提供了大量的类和接口,如 Swing(图形用户界面)、JDBC(数据库连接)、XML处理等。通过实例,读者可以...

    JAVA 入门简易教材

    我们将学习如何使用Class类、Constructor类、Method类等进行反射操作。 **章节十一:JAVA标准库** JAVA标准库提供了丰富的API,涵盖了网络编程、数据库连接、XML处理等多个领域。本章将挑选一些常用库进行简要介绍...

    Java基础入门教程

    在Java中,你需要创建一个名为`public class HelloWorld`的源文件,包含`public static void main(String[] args)`方法,其中输出字符串"Hello, World!"。 四、基本语法 1. 注释:Java有三种注释方式,单行注释(//...

    java学习过程中一点总结带实例程序,按章节渐进的

    - **Class类**:代表Java类,通过Class对象可以创建类的实例、获取类的属性和方法。 10. **JDBC数据库操作** - **JDBC API**:Java连接数据库的标准接口,包括Connection、Statement、PreparedStatement和...

    Java SE编程入门教程 java封装继承多态(共56页).pptx

    10. **反射**:Java反射API允许在运行时检查类、接口、字段和方法的信息,甚至动态调用方法和改变对象状态。这在编写元编程或插件系统时很有用。 11. **泛型**:泛型提供了一种方式来指定容器类的元素类型,增强了...

Global site tag (gtag.js) - Google Analytics