-
无论生成某个类的多少对象,这些对象都会对应于同于个class。
tips1: 反射的一切操作都是由Object完成,类、数组的引用都可以用Object进行接收。 -
要想使用反射,首先需要获得待处理类货对象所对应的Class对象。
tips2: 所有类的对象实际上都是Class类的实例。 -
获取某个类或某个对象对应的Class对象的3种方式:
使用Class类的静态方法:forName
使用类的.class语法: String.class
使用对象的getClass()方法:String s = “aa”, Class<?> clazz = s.getClass(); -
若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
-
先获得Class对象,然后通过Class的newInstance()方法直接生成即可:Class<?> clazz = String.class, Object obj = clazz.newInstance();
tips: 这个方式必须保证类中存在无参构造方法。 -
先获得Class对象,然后通过该对象获得对应的Constructor对象,在通过该Constructor对象的newInstance()生成:
Class<?> clazz = String.class,
Construcor cons = clazz.getCostructor(new Class[]{}),
Object obj = cons.newInstance(new Object[]{});
-
-
若想通过带参数的构造方法生成对象,只能通过下面一种方式:
Class<?> clazz = String.class, Construcor cons = clazz.getCostructor(new Class[]{int.class}), Object obj = cons.newInstance(new Object[]{1}); Class<?> clazz = Invoker.class; Constructorcons = clazz.getConstructor(new Class[]{String.class,int.class}); Object obj = cons.newInstance(new Object[]{"GuangPing",27}); Field field = clazz.getDeclaredField("name"); field.setAccessible(true); //压制java对访问修饰符的检查 field.set(obj, "LiPing"); Invoker invoker = (Invoker)obj; System.out.println(invoker.getName()); Method method = clazz.getDeclaredMethod("prints", new Class[]{}); method.setAccessible(true); method.invoke(obj, new Object[]{});