- Java 反射机制是在运行状态中,动态获取信息以及动态调动对象方法的功能。对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。Java反射的3个动态性质:
运行时生成对象实例运行期间调用方法运行时更改属性 优点:
能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。与 Java 动态编译相结合,可以实现无比强大的功能。对于 Java 这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象.
获取类的信息
- )获取class对象
- 调用对象的getClass()方法: Student stu=new Student(); Class cla=stu.getClass();调用类的class属性: Class cla=Student.class;使用Class类的forName()静态方法:Class cla=Class.forName(“com.zb.student”)(类名前添加完整包名)
- 访问Class对应的类所包含的构造方法 (Constructor)访问Class对应的类所包含的方法 (Menthod)访问Class对应的类所包含的属性 (Filed)访问Class对应的类所包含的注解 (Annotation)访问Clas对应的类的其他信息
创建对象:
- 使用class对象的newInstance()方法创建对象使用Constructor对象创建对象
访问类的属性
访问类的方法
使用Array类动态创建和访问数组
public class Student {
private String name;
private int age;
//省略构造方法 gettet/setter方法
//展示信息
public void show(){
System.out.println("姓名:"+name+"t年龄:"+age);
}
}
//测试
public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取class对象
Class stu=Class.forName("demo1.Student");
//获取Student属性
Field[] fields=stu.getFields(); //获取公有属性
Field[] all=stu.getDeclaredFields(); //获取所有属性
//遍历共有属性
System.out.println("公有属性------");
for (Field field : fields) {
System.out.println(field.getName());
}
//遍历所有属性
System.out.println("全部属性-----");
for (Field field : all) {
System.out.println(field.getName());
}
//公有方法,包含继承方法
Method[] method=stu.getMethods();
System.out.println("公有方法-------");
for (Method method1 : method) {
System.out.println(method1.getName());
}
//所有方法 不包含继承方法
Method[] declaredMethods = stu.getDeclaredMethods();
System.out.println("全部方法-----");
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod.getName());
}
System.out.println("构造方法-------------");
//构造方法 无参
Constructor constructor1=stu.getConstructor();
//构造方法 有参
Constructor constructor2=stu.getConstructor(new Class[]{String.class
,int.class});
//创建对象
Object obj1=constructor1.newInstance();
Object obj2=constructor2.newInstance("张三",18);
//获取一个方法
Method showMethod=stu.getMethod("show", null);
//调用方法
System.out.println("无参构造----");
showMethod.invoke(obj1,null);
System.out.println("有参构造----");
showMethod.invoke(obj2,null);
}
}



