JAVA反射机制:在运行状态中
对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
java中只有普通数据类型(int等)、静态成员 不是对象,
其他都是对象
下面是获取类的所有属性和方法的代码:
import java.lang.reflect.*;
public class ClassUtil {
public static void printClassMessage(Object obj){
//获取类类型
Class c = obj.getClass();
//获取类的名称
System.out.println("类的名称是:" + c.getName());
//获取类的方法信息(一个方法就是一个Method对象)
//getMethods获取所有public方法(包括父类继承的),getDeclaredMethods获取该类自己声明的方法
System.out.println("类的方法:");
Method[] ms = c.getMethods();
for(int i = 0 ; i < ms.length ; i++){
//得到方法的返回值类型
Class returnType = ms[i].getReturnType();
System.out.print(returnType.getName() + " ");
//得到方法的名称
System.out.print(ms[i].getName() + "(");
//得到方法的参数类型
Class[] paramTypes = ms[i].getParameterTypes();
for(Class class1 : paramTypes){
//得到方法的参数名
System.out.print(class1.getName() + ",");
}
System.out.println(")");
}
//获取成员函数信息
//getField获得所有public的成员变量,getDeclaredFields获得所有自己声明的成员变量
System.out.println("成员变量:");
Field[] fs = c.getDeclaredFields();
for(Field field :fs){
//得到成员变量的类型的类类型
Class fieldType = field.getType();
String typeName = fieldType.getName();
//得到成员变量的名称
String fieldName = field.getName();
System.out.println(typeName + " " + fieldName);
}
//获取构造函数信息
//getConstructors获取所有public的构造函数,getDeclaredConstructors获得所有构造函数
System.out.println("构造函数:");
Constructor[] cs = c.getDeclaredConstructors();
for(Constructor constructor :cs){
System.out.print(constructor.getName() + "(");
//获取构造函数的参数列表
Class[] paramTypes1 = constructor.getParameterTypes();
for(Class class1 : paramTypes1){
System.out.print(class1.getName() + ",");
}
System.out.println(")");
}
}
}
例如获得String类的所有信息,结果如下(一部分):
下面是反射具体的一个类的例子
class A{
public void print(int a ,int b){
System.out.println(a + b);
}
public void print(String a , String b ){
System.out.println(a.toUpperCase() + "," + b.toLowerCase());
}
}
public static void main(String[] args) {
//获取类的信息
A a1 = new A();
Class c = a1.getClass();
//获取方法:getMethod(方法名,参数)
try {
Method m = c.getMethod("print",new Class[]{int.class,int.class});
Method m1 = c.getMethod("print", new Class[]{String.class,String.class});
//两个方法,同样的结果
//方法一:a1.print(10,20);用a1对象 调用 print对象
//方法二:方法的反射,用m方法对象调用a1对象
Object o = m.invoke(a1,new Object[]{10,20});
System.out.println("**************");
Object o1 = m1.invoke(a1, new Object[]{"hello","world"});
}
}
补充:java中集合的泛型,是防止输入错误的,只在编译时生效,运行时无效,所以可以通过反射,即使数据不满足泛型,也可以插入到集合中。