目录
获取类信息的三种方式
1、类名.class
2、对象.getClass()
3、Class.forName(字符串)
这个字符串是全限定名:包名+类名
利用反射分析一个类的能力
常用的获取类属性的方法
一、
//返回包含Field对象的数组,记录这个类或其超类的共有域
Fileld[] getFields()
//记录这个类的全部域,如果没有域,返回长度为0的数组
Fileld[] getDeclaredTields()
//返回包含Method对象数组。返回所有公有方法,包括从超类继承来的
Method[] getMethods()
//返回全部方法
Method[] getDeclareMethods()
//返回包含Constructor对象数组,包含这个类的共有构造器
Constructor[] getConstructirs()
//所有构造器
Constructor[] getDeclaredConstructors()
下面这个代码就可以通过反射分析类信息:向程序传去一个任意类的全类名。
public class ReflectionTest {
public static void main(String[] args){
String name;
if(args.length>0) name=args[0];
else {
Scanner in =new Scanner(System.in);
System.out.println("Enter class name (e.g.jaca.util.Date):");
name=in.next();
}
try
{
Class cl=Class.forName(name);
Class supercl=cl.getSuperclass();
String modifiers = Modifier.toString(cl.getModifiers());
if (modifiers.length()>0) System.out.print(modifiers+" ");
System.out.print("class "+name);
if (supercl!=null &&supercl!=Object.class) System.out.print(" extends "+supercl.getName());
System.out.print("\n{\n");
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.print("}");
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
System.exit(0);
}
public static void printConstructors(Class cl){
Constructor[] constructors=cl.getDeclaredConstructors();
for (Constructor c:constructors){
String name=c.getName();
System.out.print(" ");
String modifiers =Modifier.toString(c.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers +" ");
System.out.print(name+"(");
Class[] paramTypes =c.getParameterTypes();
for(int j=0;j<paramTypes.length;j++){
if(j>0) System.out.print(",");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
public static void printMethods(Class cl){
Method[] methods=cl.getDeclaredMethods();
for(Method m:methods){
Class reType =m.getReturnType();
String name=m.getName();
System.out.print(" ");
String modifiers=Modifier.toString(m.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers +" ");
System.out.print(reType.getName() +" "+name+"(");
Class[] paramTypes=m.getParameterTypes();
for(int j=0;j<paramTypes.length;j++){
if(j>0) System.out.print(",");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
public static void printFields(Class cl){
Field[] fields=cl.getDeclaredFields();
for(Field f:fields){
Class type=f.getType();
String name=f.getName();
System.out.print(" ");
String modifiers=Modifier.toString(f.getModifiers());
if(modifiers.length()>0) System.out.println(modifiers+" ");
System.out.println(type.getName()+" "+name+";");
}
}
}
在运行时通过反射分析对象
上面是 查看任意对象的数据域名字,和类型
- 获取对应的Class对象
- 通过Class对象调用