1.反射的意义:动态获取类以及类中的成员,并可对成员操作
字节码对象:类的父类。所有同一个类(比如Person类)都是由Person.Class(Person字节码)创建的
2.动态创建对象的三种方法
方法(1).String className = "Person"; Class clazz = Class.forName("className"); //推荐用这种方法
方法(2).Person p = new Person(); Class clazz = new p.getClass();
方法(3).Class clazz = Person.class;
3.动态创建对象
String className = "Person";
Class clazz = Class.forName("className");
Object obj = clazz.newInstance();
注:用这个方法的前提是Person类中有空的构造函数。
如果Person类没有构造函数,需要自己指定构造函数。
String className = "Person";
Class clazz = Class.forName("className");
Constructor cons = clazz.getConstructor(String.class,int.class);
Object obj = cons.newInstance("lisi",23);
4.获取属性
String name = "Person";
Class clazz = Class.forName(name);
Object obj = clazz.newInstance();
Field field = clazz.getDeclaredField("age");//私有属性不可以获取
field.setAccessible(true);//获取访问权限
field.set(obj,20);
5.获取方法
String name = "Person";
Class clazz = Class.forName(name);//这两步是一样的
(1).非静态,无参数的方法
Object obj = clazz.newInstance();
Method m = clazz.getMethod("showString",null);
m.invoke(obj,null);
(2).非静态,有参数的方法
Object obj = clazz.newInstance();
Method m = clazz.getMethod("ShowString",String.class,int.class);
m.invoke(obj,"lisi",23);
(3).静态,无参数的方法
Method m = clazz.getMethod("ShowString",null);
m.invoke(null,null);