目前创建对象的三种方式:1.通过构造方法,用关键字new来创建对象 2.用clone来浅拷贝一个对象 3.利用反射机制,反射一个对象
反射方式创建类;
1.利用已经存在的对象来反射新的对象
1 Student s = new Student();
2 Class sClazz = s.getClass();
2.利用已知类名来创建对象
1 Class clazz = Student.class;
3.利用准确的类名来创建对象
1 Class clazz = Class.forName("com.bli.zyx.Student");
2 Student s=(Student)clazz.newInstance();
//newInstance会去找无参的构造方法执行,创建对象
如果对象中没有无参的构造方法,那么我们需要创建一个构造器来创建有参的构造方法
1 Constructor <Student> c=clazz.getConstructor(String.class,String.class);//利用构造器,后面的参数是构造函数中的形式参数类型
通过构造器的方式可以匹配不同的参数列表的构造方法
Constructor<Student> c = clazz.getConstructor(String.class,int.class);
Student s1 = c.newInstance("asdfa",123);
s1.eat();
Constructor [] consList = clazz.getConstructors();//构造器数组,可以把所有的构造器都取到
取到属性:
获取共有的属性
Field f = clazz.getField("room");
f.set(s1, "room222");//设置属性
获取私有的属性
Field f1 = clazz.getDeclaredField("stuNo"); System.out.println(f1.getName()); f1.setAccessible(true);// 给权限来修改私有的属性值 f1.set(s1, "101");
获取属性数组,并遍历
Field [] flist = clazz.getDeclaredFields(); for(Field f:flist){ System.out.println(f.getName()); }
获取方法:
获取公开的方法:
Method studyM1 = clazz.getMethod("study", String.class); studyM1.invoke(s1, "hello");
获取私有的方法:
Method m3 = clazz.getDeclaredMethod("study", String.class); m3.setAccessible(true);// 给权限 m3.invoke(s1, "abc");
获取方法的数组,并遍历
Method [] mList = clazz.getDeclaredMethods(); for(Method m : mList){ System.out.println(m); }