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

本文介绍了一个使用Java反射机制获取类信息的方法。通过反射可以获取类名、接口、父类、方法及构造函数等元数据。核心代码展示了如何利用Class.forName加载类,并调用相应的方法获取类的各种属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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可是不一样的。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值