`

java中反射:反射的应用--取得类的结构(三)

 
阅读更多

通过反射的到一个类的完整结构,那么这就要使用到 java.lang.reflect 包中的以下几个类。

Constructor:表示类中的构造方法。

Field:表示类中的属性。

Method:表示类中的方法。

这三个类都是AccessbleObject 类的子类

范例:
China接口:
package com.testFS.test;

public interface China {
 public static final String NATIONAL="China";//定义全局常量
 public static final String AUTHOR="li hua";
 public void sayChina();//定义无参的抽象方法
 public String sayHello(String name,int age);//定义有参的抽象方法

}
Person01类:
package com.testFS.test;

public class Person01 implements China {

 private String name;
 private int age;
 
 public Person01() {
  super();
  // TODO Auto-generated constructor stub
 }

 public Person01(String name, int age) {
  super();
  this.name = name;
  this.age = age;
 }

 @Override
 public String toString() {
  return "Person01 [name=" + name + ", age=" + age + "]";
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 @Override
 public void sayChina() {
  // TODO Auto-generated method stub
  System.out.println(""+AUTHOR+""+NATIONAL);
 }

 @Override
 public String sayHello(String name, int age) {
  // TODO Auto-generated method stub
  return name+""+age+"";
 }
}
取得所有实现的全部接口:
要取得一个类所实现的全部接口,则必须使用Class类中的 getInterfaces() 方法。
定义如下:
public Class[] getInterfaces()
getInterfaces() 方法返回一个 Class 类中的getName()方法输出即可。
范例:取得Person01类实现的全部接口
package com.testFS.test;

public class GetInterfaceDemo {

 public static void main(String[] args) {
  Class<?> c1=null;
  try {
   c1=Class.forName("com.testFS.test.Person01"); //实例化对象
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  Class<?> c[]=c1.getInterfaces();//取得实现的全部接口
  for(int i=0;i<c.length;i++){
   System.out.println("实现的接口名称:"+c[i].getName());
  }
 }
}
运行结果:
实现的接口名称:com.testFS.test.China

 

因为接口是类的特殊形式,而且一个类可以实现多个接口,所以此时以Class 数组的形式将全部的几口对象返回,并利用循环的方式将内容依次输出。
 
取得父类 
一个类可以实现多个接口,但是只能继承一个父类,所以如果要取得一个类的父类,可以直接使用Class类中的getSuperclass() 方法。
定义如下:
public Class<? super T> getSuperclass()
getSuperclass() 方法返回的是Class实例,和之前得到接口一样,可以通过getName() 方法取得名称。
范例:取得Person01的父类
package com.testFS.test;

public class GetSuperClassDemo {

 public static void main(String[] args) {
  Class<?> c1=null;
   try {
    c1=Class.forName("com.testFS.test.Person01");
   } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   Class<?> c2=c1.getSuperclass();
   System.out.println("父类名称:"+c2.getName());
 }
}
运行结果:
父类名称:java.lang.Object
Person01类没有明确地继承一个父类,所以默认继承Object类。
取得全部构造方法:
要取得一个类中的全部构造方法,则必须使用Class 类中的 getConstructors() 方法。
范例:
package com.testFS.test;

import java.lang.reflect.Constructor;

public class GetConstructorDemo01 {

 public static void main(String[] args) {
  Class<?> c1=null;
  try {
   c1=Class.forName("com.testFS.test.Person01"); //实例化对象
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  Constructor<?> con[]=c1.getConstructors();
  for(int i=0;i<con.length;i++){
   System.out.println("Person01类中的构造方法:"+con[i]);
  }
 }
}
运行结果:
Person01类中的构造方法:public com.testFS.test.Person01()
Person01类中的构造方法:public com.testFS.test.Person01(java.lang.String,int)
 
取得全部方法:
要取得一个类中的全部方法,可以使用Class类中的 getMethods() 方法,此方法返回一个Method类的对象数组。
范例:
package com.testFS.test;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class GetMethodDemo {

 public static void main(String[] args) {
  Class<?> c1=null;
  try {
   c1=Class.forName("com.testFS.test.Person01"); //实例化对象
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
  Method m[]=c1.getMethods();
  for(int i=0;i<m.length;i++){
   Class<?> c2=m[i].getReturnType();//得到方法返回值类型
   Class<?> c3[]=m[i].getParameterTypes();//得到全部的参数类型
   int xx=m[i].getModifiers(); //得到方法的修饰
   System.out.print(Modifier.toString(xx)+" ");//还原修饰符
   System.out.print(c2.getName()+" ");//取得方法名
   System.out.print(m[i].getName());//取得方法名称
      System.out.print(" ("); //输出“(”
     
      for(int x=0;x<c3.length;x++){
       System.out.print(c3[x].getName()+ " " + "arg" + x); //输出参数
       if(x<c3.length-1){
        System.out.print(",");//判断是否输出“,”
       }
      }
      Class<?> ex[]=m[i].getExceptionTypes();//得到全部的异常抛出
      if(ex.length>0){
       System.out.print(") throws "); //输出“) throws ”
      }
      else{
       System.out.print(" ) "); //输出“)”
      }
      for(int j=0;j<ex.length;j++){
       System.out.print(ex[j].getName());//输出异常信息
             if(j<ex.length-1){
              System.out.print(",");//输出“,”
             }
      }
      System.out.println(); //换行
  }
 }
}
输出结果:
public int getAge ( )
public void setAge (int arg0 )
public void sayChina ( )
public java.lang.String sayHello (java.lang.String arg0,int arg1 )
public java.lang.String toString ( )
public java.lang.String getName ( )
public void setName (java.lang.String arg0 )
public final native java.lang.Class getClass ( )
public native int hashCode ( )
public boolean equals (java.lang.Object arg0 )
public final native void notify ( )
public final native void notifyAll ( )
public final void wait (long arg0,int arg1) throws java.lang.InterruptedException
public final void wait () throws java.lang.InterruptedException
public final native void wait (long arg0) throws java.lang.InterruptedException

从程序中看,程序不仅将Person类的方法输出,也把从Object 类中继承而来的方法同样进行了输出。

提示:在使用IDE进行程序开发时,基本都是带随笔提示功能,即使一个“."就可以找到类的全部方法,实际上这个功能就是利用此种方式完成的。
 
 
分享到:
评论

相关推荐

    java课件1到12章

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)于1995年发布。它的设计目标是提供“一次编写,到处运行”的能力,使得...祝你在Java的学习旅程中取得丰硕的成果!

    java反射机制详解

    ### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    java 反射取得类的私有属性,通过私有属性取得属性值

    Java反射API提供了一系列类和接口,如`Class`、`Field`、`Method`等,它们让我们能够在运行时动态地获取类的信息,包括类的结构、方法签名以及字段等。这为编程提供了极大的灵活性,尤其是在处理第三方库或者进行元...

    Java反射机制

    最初的应用是在程序设计语言领域,特别是Lisp和面向对象编程中取得了显著成果。例如,LEAD/LEAD++、OpenC++、MetaXa以及OpenJava等都是基于反射机制的编程语言。 近年来,反射机制的应用已经超越了编程语言的范畴,...

    【电子版】Java校招面试题库(附答案与解析)java篇.zip

    Java是目前全球最流行的编程语言之一,特别是在企业级应用开发领域。对于即将毕业并寻求进入IT行业的学生来说,掌握Java语言及其相关知识是至关...通过系统性的复习和实践,相信你能在Java校招面试中取得优异的成绩。

    Java语言反射机制原理探析.pdf

    本文将深入探讨Java反射机制的原理及其在Java中的实现方式。 首先,反射的重要性体现在几个方面。它提高了程序的灵活性和扩展性,允许在不修改现有代码的情况下,根据需求动态地创建对象和调用方法。通过反射,可以...

    Java技术手册:第6版

    《Java技术手册:第6版》是一本详尽深入的Java编程指南,旨在帮助开发者全面理解和掌握Java语言的核心概念和技术。...通过深入学习和实践,你将能够熟练运用Java进行各种复杂应用的开发,从而在软件工程领域取得成功。

    【Java面试资料】-(机构内训资料)深圳-银盛支付-Java中级

    通过这份资料,应聘者可以系统地复习Java相关的知识点,并针对性地提升自己的面试表现,为在银盛支付或其他Java开发岗位的面试中取得成功做好充分准备。同时,对Java技术的深入理解和实践也能为日常开发工作带来巨大...

    JAVA笔试面试及答案题库-经典奉献

    为了在Java的笔试和面试中取得成功,了解并掌握相关的核心知识点至关重要。这份"JAVA笔试面试及答案题库-经典奉献"提供了丰富的资源,帮助求职者充分准备。 1. **基础知识** - **Java语法**:包括类、对象、接口、...

    java之浅谈深说--教你如何成长

    1. **Java语言基础**:包括变量、数据类型、运算符、控制结构(如循环和条件判断)等基本语法。 2. **面向对象编程(OOP)**:理解类、对象、继承、封装、多态等核心概念。 3. **异常处理**:学会正确使用try-catch-...

    java笔试,java

    Java笔试是评估应聘者在Java编程语言方面技能的重要环节,对于想要进入IT行业尤其是Java开发岗位的人来说,掌握扎实的Java知识至关重要。...深入理解和熟练掌握这些知识点,将有助于在Java笔试中取得优异成绩。

    Java-JDK、数据库系统开发、Web开发学习笔记

    3. Java反射机制:反射机制允许程序在运行时透过Reflection API取得任何一个已知名称的class类的内部信息,包括其修饰符、父类类型、实现接口interface、属性字段、方法,并可以在运行时改变属性内容和调用方法。...

    java笔试+面试+答案

    为了在Java的笔试和面试中取得成功,了解并掌握相关的核心知识点至关重要。以下是一些关键的知识点,涵盖了从基础到进阶的各个方面。 1. **基础语法**: - 数据类型:Java分为基本数据类型(如int、char、boolean...

    一份超级详细的Java面试题【大厂面试真题+Java学习指南+工作总结】

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在激烈的求职竞争中脱颖而出,掌握深入的Java知识并了解最新的面试趋势至关重要。以下是一份基于标题和描述的大纲,涵盖了Java面试中...

    最新版---java面试题

    8. **反射机制**:理解如何在运行时动态加载类、创建对象和调用方法,以及其在框架中的应用。 9. **设计模式**:了解常见的设计模式,如单例、工厂、观察者、装饰器等,并能结合实际场景应用。 10. **JVM优化**:...

    Java 笔试面试下载

    【标题】"Java 笔试面试下载" 涉及的知识点主要集中在Java编程语言的基础概念、核心特性、以及在面试和笔试中...因此,熟悉这些Java核心概念,并能够灵活运用到实际开发中,将有助于在Java相关的笔试和面试中取得成功。

    Java面试,考试题

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。...以上知识点涵盖了Java面试和考试中的常见主题,深入理解和掌握这些内容将有助于提升你的Java技能,并在求职或考试中取得好成绩。

    面试必备(java方面的面试集合)

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。这份"面试必备(java方面的面试集合)"包含了一系列与Java相关的面试题目,旨在帮助求职者准备即将到来的技术面试。以下是对这些知识点的...

    java试题及答案参考

    - 异常类型:了解Java中的Exception类层次结构。 - try-catch-finally:学习如何编写异常处理代码块,理解finally的作用。 - 自定义异常:如何定义并抛出自定义异常。 4. **集合框架**: - List、Set、Queue...

Global site tag (gtag.js) - Google Analytics