利用java的反射机制得到类的信息

在java中与c#中都提供了反射机制,利用这种反射机制可以做很多有用的事情,比如实现AOP等功能,最近看了一篇关于实现AOP的内部机理的Blog,所以,开始看了一些反射的文章,这里我把我写的一些代码拿出来,供大家分享,不久还会提供C#的利用反射机制得到类的信息的代码。

程序运行的命令如下:(我把我的JAVA程序放到了c:/java下面了)

运行界面的部分截图如下:

 

详细的代码如下:

 

import java.lang.reflect. * ;
import java.util.regex.
* ;
public   class  ClassInfo 
    {
        
static   void  printinfor(Class cc)
        {
            System.
out .println( " 类名-> " + cc.getName());
            
        }
        
private   static  Pattern p = Pattern.compile( " /w+/. " );
        
public   static   void  main(String args[])
        {
            System.
out .println( " ************************************************ " );
            System.
out .println( " ******************类的详细信息提取************** " );
            System.
out .println( "    使用方法:java ClassInfo  类名(类的全名) " );
            System.
out .println( "    例如:java ClassInfo String " );            
            System.
out .println( "    目前支持类的简写的支持 " );            
            System.
out .println( " ************************************************ " );

            
if (args.length < 1 )
            {
                System.
out .println( " 用法错误 " );
                System.
out .println( " Example:java ClassInfo  String " );
                System.exit(
0 );
            }
            Class c
= null ;
            
try
            {
                c
= Class.forName( " java.lang. " + args[ 0 ]);
                Method[] m
= c.getMethods();
                Constructor[] ctor
= c.getConstructors();
                
                
if (args.length == 1 )
                {
            printinfor(c);
            Class []interarray
= c.getInterfaces();
            
for ( int  i = 0 ;i < interarray.length;i ++ )
            System.
out .println(c.getName() + " " + (i + 1 ) + " " + " 接口   " + interarray[i].getName());
            
            Class cy
= c;
            
int  temp = 1 ;        
            
do
            {
                cy
= cy.getSuperclass();
                System.
out .print( " " + temp + " 级父类   " );
                printinfor(cy);
                temp
++ ;                
            }
            
while (cy.getName() != " java.lang.Object " );
                
for ( int  i = 0 ;i < m.length;i ++ )
                System.
out .println( " " + (i + 1 ) + " 个方法 " + p.matcher(m[i].toString()).replaceAll( "" ));
                
for ( int  i = 0 ;i < ctor.length;i ++ )
                System.
out .println( " " + (i + 1 ) + " 构造函数 " + p.matcher(ctor[i].toString()).replaceAll( "" ));
                }
                
else
                {
                    System.
out .println( " 该方法只能带一个参数 " );
                }
            }
            
catch (ClassNotFoundException e)
            {
                System.
out .println( " 没有找到给定类的信息 " );
                System.exit(
0 );
            }            
        }
    }

注意其中的

c=Class.forName("java.lang."+args[0]);
    Method[] m=c.getMethods();
    Constructor[] ctor=c.getConstructors();

这个是反射代码的核心。

理解反射代码的核心在于,在java程序运行的时候,关于类的元数据都存放在一个特殊的类里面,这个类在java里被称为“Class”,注意,这里的Class的C是大写,与平时的class可是不一样的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值