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