`

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反射 反编译:.class--&gt;.java

    二,反射机制的作用: 1,反编译:.class--&gt;.java 2,通过反射机制访问java对象的属性,方法,构造方法等; 这样好像更容易理解一些,下边我们具体看怎么实现这些功能。

    Java SE 8 Programmer I Study Guide: Exam 1Z0-808

    Title: OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808 Author: Jeanne Boyarsky, Scott Selikoff Length: 432 pages Edition: 1 Language: English Publisher: Sybex ...

    项目实践精解:基于Struts-Spring-Hibernate的Java应用开发

    项目实践精解:基于Struts-Spring-Hibernate的Java应用开发(网上书店,有详细介绍)

    反射实例-JAVA反射机制.doc

    反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc...

    Java 第三阶段增强分析需求,代码实现能力【反射】---- 代码

    Java 第三阶段增强分析需求,代码实现能力【反射】---- 代码 Java 第三阶段增强分析需求,代码实现能力【反射】---- 代码 Java 第三阶段增强分析需求,代码实现能力【反射】---- 代码 Java 第三阶段增强分析需求,...

    毕向东 Java 课件

    毕向东 Java 第一章:编程基础 3-11 第二章:数组 11-31 第三章:面向对象程序开収 31-74 第四章:异常机制 74-89 第五章:多线程技术 89-122 第六章:常用类API 122-139 第七章:集合框架(容器)+其他类...

    Java试题-3:反射和泛型的综合应用

    Java试题-3:反射和泛型的综合应用 Java反射 泛型都是比较高级的应用技术

    JAVA 反射机制应用

    JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用

    java反射 java反射 java反射java反射

    java反射 java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射

    java的反射机制及其实际应用

    Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源...

    JAVA基础--JAVA中的反射机制详解

    JAVA基础--JAVA中的反射机制详解:本文档详细的介绍了Java的反射API的应用,希望能对各有所帮助

    Java反射技术的一般应用

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    JAVA设计模式--程序设计--反射--注解--泛型

    JAVA设计模式--程序设计--反射--注解--泛型

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

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

    Java试题-5:应用反射创建对象,调用对象方法

    Java试题-5:应用反射创建对象,调用对象方法 反射为Java的高级技术应用

    java中反射的概念

    通过学习后,保证初学者对反射有一个很好的理解,有助于之后对反射的进一步学习。 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测...最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。

    java反射JAVA REFLECT (java 反射)

    JAVA REFLECT (java 反射) 取得类的继承结构 - 类所在的包; |- public Package getPackage() - 类的声明方式; |-取得全类名:public String getName() |-只取类名: public String getSimpleName() - 类所继承...

    Java基础详解(入门级)

    全书共16章,通俗易懂的语言...第十一章:反射机制 310-315 第十二章:正则表达式 315-322 第十三章:HTML 语言 322-335 第十四章:CSS 语言 335-341 第十五章:JavaScript 语言 341-375 第十六章:DOM 375-429

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名。本项目为普通java项目

    底层的技术-----反射技术

    反射的实际应用: String----类---实例化成对象 设计一个方法,给一个字符串(类)返回一个对象,对象里面还有属性值 例如考试系统中 Question类型 ATM系统 User类型 Question和User类型都是我们自定义的,这两...

Global site tag (gtag.js) - Google Analytics