JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
静态加载类:在程序编译期加载;
动态加载:在程序的运行期加载;
所有类都是Class类的实例(对象),所有的属性都是Field类的实例,所有的方法都是Method类的实例。
1.类的反射
获得Class实例的三种方法
//1.类的反射 通过类名获得
Class c=Worker.class;
System.out.println(c);
Worker worker=new Worker(101,21,"小王","男");
//2.通过类的对象获得
Class c2=worker.getClass();
System.out.println(c2);
//3.通过动态加载获得
Class c3= Class.forName("com.sgh.demo.Worker");
System.out.println(c3);
输出结果:c=c2=c3
//通过Class类类型获得类的实例
//三个对象不一样
System.out.println(worker1.hashCode());
System.out.println(worker2.hashCode());
System.out.println(worker3.hashCode());
获取类的信息
//获得所有的属性
Field [] fields=c2.getFields();// 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
Field [] fields1=c2.getDeclaredFields();获得自己所有的属性,不限访问权限
for(Field f:fields){
System.out.println(f.getType());//获得属性的类型
System.out.println(f.getName());//获得属性名称
}
//获得所有的方法
Method [] methods=c2.getMethods();//获得所有公开的方法 自己的和父类的
Method [] methods1=c2.getDeclaredMethods();//获得自己的所有方法 不限访问权限
for(Method m:methods1){
System.out.println(m);
System.out.println(m.getName());//获得方法名字
System.out.println(m.getParameterTypes());//获得方法参数类型
}