最近重新复习了Java反射,记录如下。
通过反射获取类的基本信息:
获取类的构造函数:
public static void getConstructors(Object obj) {
Class class1 = obj.getClass();
//get class1's constructors
Constructor[] constructors = class1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
String cName = constructor.getName();
System.out.print(cName+"(");
Class[] parameterTypes = constructor.getParameterTypes();
for (Class type : parameterTypes) {
System.out.print(type.getName()+",");
}
System.out.println(")");
}
}
//测试代码:
ReflactDemo.getConstructors(new Integer(1));
System.out.println("-----");
ReflactDemo.getConstructors("test");
测试结果:
获取类的属性
public static void getFields(Object obj) {
Class class1 = obj.getClass();
//get class1's members
Field[] fields = class1.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
String fieldType = field.getType().getSimpleName();
System.out.println(fieldType + " " + fieldName);
}
}
//测试代码
class TestClass1{
public String name = "bear";
public int age = 18;
public float power = (float) 10.6;
public TestClass1() {
this.name = "bear2";
}
public void print()
{
System.out.println(name+" "+age+" "+power);
}
}
ReflactDemo.getFields(new TestClass1());
获取类的方法:
public static void getMethods(Object object) {
Class class1 = object.getClass();
//get class1's methods;
Method[] methods = class1.getDeclaredMethods();
for (Method method : methods) {
Type returnType = method.getGenericReturnType();
System.out.print(returnType+" ");
System.out.print(method.getName()+"(");
Class[] types = method.getParameterTypes();
for (Class type : types) {
System.out.print(type.getName()+",");
}
System.out.println(")");
}
}
//测试代码:
ReflactDemo.getMethods("klajs");
调用类的方法:
try {
Class class1 = Class.forName("com.bear.TestClass1");
Method method = class1.getMethod("print", new Class[]{});
method.invoke(class1.newInstance());
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
e.printStackTrace();
}