反射
创建对象先会将.class解刨然后加载到方法区,之后再将其实例化。
反射就是当一个文件加载到内存的时候,Jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们就可以使用字节码对象设置对象的属性或者调用对象等方法操作……。
三种得到.class文件的方式:
// 反射三种方法
Class clazz1 = 类名.class;
Class clazz2 = Class.forName("包名.类名");
类名 变量名 = new 类名();
Class clazz3 = 变量名.getClass();
示例:
/**
* 泛型测试类
* @author 周太阳
* @version 1.0
* 2019年5月14日 上午11:07:55
*/
public class Student {
private String name;
public char gender;
public Student() {
System.out.println("学生创建了");
}
private Student(String name) {
super();
this.name = name;
}
public Student(String name, char gender) {
super();
this.name = name;
this.gender = gender;
}
private String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student [name=" + name + ", gender=" + gender + "]";
}
}
public static void main(String[] args) throws Exception {
// 反射三种方法
Class clazz1 = Student.class;
Class clazz2 = Class.forName("cn.kgc.reflect.Student");
Student stu = new Student();
Class clazz3 = stu.getClass();
// 获取到所有公共的构造方法
clazz1.getConstructor();
// 获取到所有构造方法
clazz1.getDeclaredConstructors();
// 获取到对应的构造方法
Constructor<Student> constructor = clazz1.getConstructor(String.class,char.class);
// 实例化对象
Student newInstance = constructor.newInstance("超人",'男');
System.out.println(newInstance);
// 获取私有构造方法
Constructor<Student> constructor1 = clazz1.getDeclaredConstructor(String.class);
// 去掉私有化
constructor1.setAccessible(true);
Student newInstance2 = constructor1.newInstance("老王");
System.out.println(newInstance2);
// 获得公共的方法包含继承的
clazz1.getMethods();
// 获得公共的方法和参数列表
Method[] methods = clazz1.getMethods();
for (Method method : methods) {
System.out.println(method);
Class<?>[] parameterTypes = method.getParameterTypes();
for (Class<?> methodParameter : parameterTypes) {
System.out.println(methodParameter);
}
}
// 获得所有方法
clazz1.getDeclaredMethods();
// 获取单个属性
Field field = clazz1.getDeclaredField("name");
// 去掉属性私有化
field.setAccessible(true);
// 设置属性
field.set(stu, "张三");
// 获得公共的属性
clazz1.getFields();
// 获得所有属性
clazz1.getDeclaredFields();
}