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