加油,新时代打工人!
反射获取class对象的四种方式?
- 类名.class
- 通过对象的getClassLoader方法的loadClass方法
- Class.forname
- Object.getClass方法
public class Student {
@Field("This is name field")
public String name;
@Field(value = "This is age field",number =20 )
private String age;
@Method("This is No-argument constructor ")
public Student() {
}
@Method("This is parameterized construction")
private Student(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class App
{
public static void main( String[] args ) throws Exception {
System.out.println("--------获取类信息----------");
//1.
Class<Student> aClass = Student.class;
System.out.println(aClass);
//2
Class<?> classLoader = App.class.getClassLoader().loadClass("nx_03_demo.pojo.Student");
System.out.println(classLoader);
//3
Class<?> forName = Class.forName("nx_03_demo.pojo.Student");
System.out.println(forName);
//4
Class<? extends Student> aClass1 = new Student().getClass();
System.out.println(aClass1);
System.out.println(aClass.getClassLoader());//获取类加载器
System.out.println(aClass.getName());
System.out.println(aClass.getPackage());
System.out.println("--------获取公有字段信息----------");
Field[] fields = aClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("--------获取类的修饰符----------");
int modifiers = aClass.getModifiers();
System.out.println(modifiers);
System.out.println(aClass.getAnnotations());
System.out.println("--------获取无参构造信息 而且修饰符只能时public----------");
Class<Student> studentClass = Student.class;
Student student1 = studentClass.newInstance();
System.out.println(student1);
System.out.println("--------获取所有的字段(包括私有、受保护、默认的)----------");
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
Field addname = aClass.getDeclaredField("name");
addname.setAccessible(true);
addname.set(student1,"小明");
System.out.println(student1.getName());
Field age = aClass.getDeclaredField("age");
addname.setAccessible(true);
addname.set(student1,"19");
System.out.println(student1.getName());
System.out.println("--------获取构造函数信息----------");
Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
System.out.println("-------获取无参构造--------");
Constructor<Student> declaredConstructor1 = studentClass.getDeclaredConstructor();
System.out.println(declaredConstructor1);
System.out.println("--------获取有参构造-------");
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, String.class);
declaredConstructor.setAccessible(true);
Student student2 = declaredConstructor.newInstance("name", "age");
System.out.println(student2);
}
}
运行结果
重点注意总结:
newInstance()获取无参构造时,类的构造只能时public
getDeclaredConstructor()获取无参构造,可以得到私有、受保护、默认的修饰的构造方法。
反射可以获取到类的所有定义的属性,方法。
反射的缺点
通过底层寻找字节码大量的加载、验证、准备、解析、初始化,使用等操作,性能比较慢。
反射的优点
提高代码的灵活性,(我们现在使用的框架,只需要改配置,不需要修改代码,如:数据库的配置,username,password,url信息)