反射是java语言中的一种机制,通过这种机制可以动态的实列化对象,
读写属性,调用方法。
类类:
Class.forName(完整类名)
Class<Student> stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
类名.class:
Class<Student> stuClazz01=Student.class;
对象.getClass():
Student stu = new Student();
Class<Student> stuClazz02=(Class<Student>)stu.getClass();
反射实列化:
getConstructor:
Constructor<Student> stuCon= stuClazz.getConstructor(String.class); Student stu03= stuCon.newInstance("ls");
System.out.println("stu03= "+stu03.getSid());
getDeclaredConstructor:
newInstance:
私有的
Constructor<Student> stuCon05=stuClazz.getDeclaredConstructor(Integer.class);
//打开私有方法权限
stuCon05.setAccessible(true);
Student stu05 = stuCon05.newInstance(23);
System.out.println("stu05 ="+stu05.age);
反射动态方法调用:
getMethod:
有参
Method m02 = stuClazz.getMethod("hello", String.class);
m02.invoke(stu02, "hhsj");
getDeclaredMethod:
私有的
Method m03= stuClazz.getDeclaredMethod("add", Integer.class,Integer.class);
m03.setAccessible(true);
int sum = (int)m03.invoke(stu02, 3,3);
System.out.println(sum);
反射读写属性:
getDeclaredField:
//获取私有的属性
Field f02= stuClazz.getDeclaredField("sname");
f02.setAccessible(true);
String name =(String) f02.get(stu02);
System.out.println(name);
getDeclaredFields:
Field[] fs =stuClazz.getDeclaredFields();
for(Field f04:fs) {
f04.setAccessible(true);
System.out.println(f04.get(stu02));
}