反射 reflect
获取 类对象 的3种方法
-
一个类的类对象只有一个(用==和equals比较如下3种方式获得的类对象,返回的是true),可以理解类对象是指生产类实例的模板。
public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException{ //1.对象获取 Person p=new Person(); //调用Person类的父类的方法getClass Class c1=p.getClass(); System.out.println(c1); //2.类名获取 //每个类型,包括基本和引用, Class c2=Person.class; System.out.println(c2); //3.Class类的静态方法forName(字符串的类名)包名.类名 Class c3=Class.forName("demo01.Person"); System.out.println(c3); } }
类对象 的Field(域)
-
获取类对象的Field
Field[] fields = c1.getFields(); //获取类对象(及其超类)的所有公有域(公有字段) Field[] fields = c1.getDeclaredFields(); //获取该类对象的所有域(含公有字段,私有字段)
-
通过反射给实例对象的field赋值(格式:field.set(实例对象, 值))
Field[] fields = c1.getDeclaredFields(); for (Field field : fields) { // 设置私有属性可访问 field.setAccessible(true); try { field.set(obj, "field"); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
类对象 的Method(方法)
-
获取类对象的Method
Method[] methods = c1.getMethods(); //获取类对象(及其超类)的所有公有方法 Method[] methods = c1.getDeclaredMethods(); //获取这个类对象(含接口)的全部方法(含公有方法,私有方法)
-
通过反射执行实例对象的方法
public class MethodInvoke { public static void main(String[] args) throws Exception { Method animalMethod = Animal.class.getDeclaredMethod("print"); Method catMethod = Cat.class.getDeclaredMethod("print"); Animal animal = new Animal(); Cat cat = new Cat(); animalMethod.invoke(cat); animalMethod.invoke(animal); catMethod.invoke(cat); catMethod.invoke(animal); } } class Animal { public void print() { System.out.println("Animal.print()"); } } class Cat extends Animal { @Override public void print() { System.out.println("Cat.print()"); } }
执行结果如下:
类对象 的Constructor(构造器)
-
获取类对象的Construcetor
Constructor[] constructors = c1.getConstructors(); //获取类对象描述类的所有公有构造方法 Constructor[] constructors = c1.getDeclaredConstructors(); //获取类对象的所有构造方法(含公有构造器和私有构造器)
-
通过反射调用构造方法
格式1:类对象.newInstance()
public class Fs { public static void main(String[] args) { Class<?> cls; try { cls = Class.forName("com.jmd.bingo.Person");//通过反射实例化Person类对象。 Person p = (Person)cls.newInstance(); System.out.println(p); } catch (Exception e) { e.printStackTrace(); } } }
格式2:类对象.getConstructor(args1.class, arg2.class, …).newInstance()
public class Fs { public static void main(String[] args) { Class<?> cls; try { cls = Class.forName("com.jmd.bingo.Person");//通过反射实例化Person类对象。 Constructor<?> cons = cls.