1.Java反射机制
反射是Java语言的特征之一。反射机制是 Java 的动态性之一动态语言,在程序运行时,可以改变程序的结构或变量类型。Java 不是动态语言,但具有一定的动态性,可以称为”准动态语言”,具备类似动态语言的特性。Java的动态性让编程变得更加的灵活,功能就更加的强大。
2.Java反射机制的优点:
①允许在运行时动态加载类
②可以访问私有属性和私有方法
class Animal{ public String name; private int age; double weight; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public Animal() { } public Animal(String name) { this.name = name; } public Animal(String name,int age) { this.name = name; this.age = age; } public Animal(String name,int age,double weight) { this.name = name; this.age = age; this.weight = weight; } }
3.通过反射获取class对象
①使用Object类中的getClass()方法
//这种创建对象的方式为正射 Animal a = new Animal(); Class c3 = a.getClass();
②使用Class类的静态方法forName(String className);
Class c4 = Class.forName("day01.Animal");
③使用class常量。
Class c1 = Animal.class;
4.通过class获取类信息
①获取类的包名:getPackage()
Class c = Class.forName(“day01.Animal”);
System.out.println("获取包:"+c.getPackage().getName());
②获取类的父类:
System.out.println("父类名:"+c.getSuperclass().getName());
③获取类的成员变量:
Field[] getFields() //仅公有的
Field[] getDeclaredFields() //所有的
Class c = Class.forName("day01.Animal"); Object animal = c.newInstance(); //获取对应属性名的field 对象 Field field = c.getDeclaredField("name"); //o代表Animal对象,设置Animal类的属性name的值 field.set(animal, "小狗"); System.out.println(field.get(animal));
④获取类的构造方法
Constructor<?>[] getConstructors()
Constructor<?>[] getDeclaredConstructors()
Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Class c = Class.forName("day01.Animal"); Object o = c.newInstance(); Field f = c.getDeclaredField("age"); //设置是否允许访问私有属性或方法,默认为false,不可访问 f.setAccessible(true); f.set(o, 10); System.out.println(f.get(o)); Constructor c1 = c.getConstructor(); System.out.println(c1); Constructor c2 = c.getConstructor(String.class,int.class); System.out.println(c2);
⑤获取类的成员方法
Method[] getMethods()
Method[] getDeclaredMethods()
Method getMethod(String name, Class<?>... parameterTypes)
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Method[] m = c.getMethods(); for (Method method : m) { System.out.println(method); } Method m1 = c.getMethod("getAge", null); System.out.println(m1);