目录
三种获取类信息的方式:
- 对象.getClass()
- 类.class
- Class.forname("类的路径")
People p;
Class c1=p.getClass();//将对象(实例)p对应的类的信息统统存储在类c1中
//(类的信息包括且不限于方法、函数、变量等)
一个输入类名字获取类信息的类:
package Java;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
public class Test1 {
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:");
name=in.next();
}
try {
Class cl=Class.forName("Java.Demo");
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.println("expends"+supercl.getName());
System.out.print("\n{\n");
printConstructor(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.println("}");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.exit(0);
}
public static void printConstructor(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.println(modifiers + " ");
System.out.println(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 retType=m.getReturnType();
String name=m.getName();
System.out.println(" ");
// 打印修饰符、返回类型和方法名称
String modifiers = Modifier.toString(m.getModifiers()); // 获取方法的修饰符
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.print(retType.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 c1) {
Field[] fields = c1.getDeclaredFields(); // 获取类c1的所有字段
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.print(modifiers + " ");
}
System.out.println(type.getName() + " " + name + ";"); // 打印字段类型和名称,并以分号结束
}
}
}
一个测试类:
package Java;
public class Demo {
public int age;
private String name;
public static int x1;
public Demo(){//不传参构造函数
}
public Demo(int a,String b){//传参构造函数
}
public void m1(String xx,int yy){//普通方法
}
public static void m2(int qq,double kk){//静态方法
}
}
运行后输入类名字"Java.Demo"
测试结果
得到: