zoukankan      html  css  js  c++  java
  • Java 反射

    在java中,只要给定类的名字,就可以利用反射机制来获得类的信息,类中有什么信息,利用反射机制就能可以获得什么信息,不过前提是得知道类的名字。

    java 反射是 Java 被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运 行时透过 Reflection APIs 取得任何一个已知名称的class 的内部信息,包括其 modifiers( 诸如 public, static 等 )、superclass (例如 Object)、 实现之 interfaces(例如 Cloneable),也包括 fields 和 methods 的所有信息,并可于运行时改变 fields 内容或唤起 methods。

    Java 反射机制容许程序在运行时加载、探知、使用编译期间完全未知的 classes。 换言之,Java 可以加载一个运行时才得知名称的 class,获得其完整结构。

    在jdk中,主要由以下类来实现java反射机制,这些类都位于java.lang.reflect包中。

    1.Class类:代表一个类

    2.Constructor类:代表类的构造方法

    3.Field类:代表类的成员变量(成员变量也称为类的属性)

    4.Method类:代表类的方法

    运用上面的Class,Constructor,Field,Method四个类,就可以解析无穷多的系统类和自定义结构。

    下面是具体的代码demo

    这是被测试类A

     1 package cn.yonyong.reflect.demo;
     2 /**
     3  * 
     4  * @author yonyong
     5  *
     6  */
     7 public class A {
     8     private int num;
     9     public A(){
    10         super();
    11     }
    12     
    13     public A(int num)
    14     {
    15         super();
    16         this.num=num;
    17     }
    18     
    19     public void func1(){}
    20     public void func2(){}
    21 }

    测试类

     1 package cn.yonyong.reflect.demo;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Field;
     5 import java.lang.reflect.Method;
     6 
     7 public class Test {
     8     public static void main(String[] args) throws ClassNotFoundException {
     9 //        1.加载并实例化制定类A
    10     
    11         Class classInfo=Class.forName("cn.yonyong.reflect.demo.A");
    12         
    13 //        2.获取类A的构造方法
    14         Constructor cons[]=classInfo.getConstructors();
    15         
    16         System.out.println("类A的构造方法如下所示:");
    17         for(int i=0;i<cons.length;i++)
    18         {
    19             System.out.println(cons[i].toString());
    20         }
    21         
    22         System.out.println();
    23         
    24 //        3.获取类A的属性
    25         Field fields[]=classInfo.getDeclaredFields();
    26         System.out.println("类A的属性如下所示:");
    27         
    28         for(int i=0;i<fields.length;i++)
    29         {
    30             System.out.println(fields[i].toString());
    31         }
    32         
    33 //        4.获取类A的普通方法
    34         System.out.println();
    35         Method methods[]=classInfo.getDeclaredMethods();
    36         System.out.println("类A的普通方法如下所示:");
    37         for(int i=0;i<methods.length;i++)
    38         {
    39             System.out.println(methods[i].toString());
    40         }
    41     }
    42 }

    注意在测试类的11行,需要导入A的路径。如果只是A的话会报ClassNotFound异常。

  • 相关阅读:
    BZOJ3578:GTY的人类基因组计划2(集合hash,STL)
    【BZOJ 1022】 [SHOI2008]小约翰的游戏John
    【BZOJ 1295】 [SCOI2009]最长距离
    【BZOJ 1103】 [POI2007]大都市meg
    【BZOJ 3172】 [Tjoi2013]单词
    【BZOJ 1067】 [SCOI2007]降雨量
    【BZOJ 1491】 [NOI2007]社交网络
    【BZOJ 1087】[SCOI2005]互不侵犯King
    【BZOJ 1009】 [HNOI2008]GT考试
    【BZOJ 1053】[HAOI2007]反素数ant
  • 原文地址:https://www.cnblogs.com/yonyong/p/8572068.html
Copyright © 2011-2022 走看看