这几天初步学习了java反射,感觉到在java中“万事万物皆对象”的真理。不管是类,接口,成员变量,方法和构造函数等都是基于对象的。下面将解释其原因:
将从获取相应的信息过程解释java中“万事万物皆对象”。怎样获取,接口,成员变量,方法和构造函数等的信息呢?我将一一解决相应得问题。
1、类是java.lang.Class类的实例对象,(将类对象的类简称于类类型)
解释说明:Class类是静态类,仅能jvm创建,隐含一个静态内部成员变量
将类转化为类类型的对象。主要有以下三种:
第一种:我们想实例一个类的对象,同过对象转化器对应的类类型。
// 创建Foo的类对象
Foo foo = new Foo();
//通过对象的getClass方法转化为类类型
Class c= foo.getClass();
第二种:直接通过类转化为对应的类类型。
// 将Foo类转化为Class类类型
Class c1 = Foo.class;
第三种:同过Class的forClass()方法转化为类类型。
//"com.example.reflect.Foo“为全类名(包名 + 类名)
c3 = Class.forName("com.example.reflect.Foo");
通过以上三种方法可以将类转化为类类型(注:forClass()为动态加载),c.getName()可以获得相应类的类型。 这样就能获得类的简单信息,同时也为获取方法,成员变量等信息打下基础。
2、成员变量也是对象,是 java.lang.reflect.Filed的对象
//得到相应类对象的类类型
Class c = object.getClass();
//c.getFields();该方法获得该类类性自己成名的public的成员变量信息
//获得自己声明的所有成员变量的信息
Field[]files =c.getDeclaredFields();
//打印成员变量的信息
for (Field field : files) {
//获得成员变量的类型的类类型
Class filedType = field.getType();
//得到成员变量的封装类型
String typeName = filedType.getName();
//得到成员变量的名称
String filedName = field.getName();
System.out.println(typeName + " " + filedName);
}
3、方法也是对象,是 java.lang.reflect.Method的对象
Class c = object.getClass();//转化为相应类型的类类型
System.out.println("该类的类型为:" + c.getName());//获取该对象的类型
/*
* Method类型,
* getMethod 获得方法对象所欲的public方法,包括继承父类的pubic方法
*
* */
//得到所有的方法
Method []methods = c.getMethods();
//c.getDeclaredMethods();该方法访问该类自己的所有方法,不能访问父类继承的方法,没有修饰符限制
for (Method method : methods) {
Class re = method.getReturnType();//获得放回值的类类性
System.out.print(re.getName() + " ");
System.out.print(method.getName() + " (");
//得到方法的参数类型
Class []parames = method.getParameterTypes();
for (Class parame : parames) {
System.out.print(parame.getName() + ",");
}
System.out.println(")");
}
4、构造函数也是对象,是java.lang.Constructor的对象
//得到相应类对象的类类型
Class c = object.getClass();
//c.getConstructors();该方法获得该对象自己修订的public构造方法
//获得自己声明的所有构造函数的信息
Constructor []constructors = c.getDeclaredConstructors();
for (Constructor constructor : constructors) {
//获取构造函数的名称
String conName = constructor.getName();
System.out.print(conName + "(");
//获得构造函数的参数类型
Class []parames = constructor.getParameterTypes();
for (Class class1 : parames) {
System.out.print(class1.getName() + ",");
}
System.out.println(")");
}
通过以上的方式我们得到了类,成员变量,方法和构造函数的信息。同类似的方法可以得到java其他的相应信息。这就不一一展示了。下面将简单介绍我们平时使用平凡的方法的反射:
//实例 MethodReflect 的对象
注: MethodReflect类中重载print方法,分别是无参和两种不同形参。
MethodReflect mReflect = new MethodReflect();
//获取MethodReflect类的信息
Class c =mReflect.getClass();
try {
//获取该类的public修饰的方法方法
Method m = c.getMethod("print");
//反射该类的方法
m.invoke(mReflect);
//获取该类的public修饰的方法方法
Method m1 = c.getMethod("print", int.class,int.class);
//反射该类的方法
m1.invoke(mReflect, 10,20);
Method m2 = c.getMethod("print", String.class,String.class);
m2.invoke(mReflect, "HELLO","world");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
最后解释说明以下,以上内容是由个人从慕课网所学的心得,如有错误的请指出,本人将非常感激。同时如想了解更详细的知识可以去慕课网。