反射

反射

什么是反射

将类的各个组成部分封装为其他对象,这就是反射机制

    好处

  1. 可以在程序运行过程中,操作这些对象

  2. 可以解耦,提高程序的可扩展性

获取Class对象的方式:

  1. Class.forName("全类名"); 将字节码文件加载内存,返回Class对象(Source源代码阶段)

         * 多用户配置文件 将类名定义在配置文件中,读取文件,加载类

  2. 类名.class 通过类名的属性获取

        * 多用于参数的传递

  3. 对象.getClass(); getClass() 在Object

    • 多用于对象的获取字节码的方式

    结论 同一个字节码文件(*.class)在一次程序运行过程中,自会加载一次,无论通过哪一种方式获取的Class对象都是同一个

// 1. Class.forName("全类名");
Class studentClass1 = Class.forName("com.lvsheng.fanshe.Student");

//2.类名.class 通过类名的属性获取
Class studentClass2 = Student.class;

// 3. 对象.getClass(); getClass() 在Object
Student studentClass3 = new Student();
Class aClass1 = studentClass3.getClass();

System.out.println(studentClass1);  //class com.lvsheng.fanshe.Student
System.out.println(studentClass2);  //class com.lvsheng.fanshe.Student
System.out.println(studentClass3);  //class com.lvsheng.fanshe.Student

System.out.println("------------------");
System.out.println(studentClass1==studentClass2);  //true

Class对象的功能

  1. 获取成员的变量

  2. 获取构造方法

  3. 获取成员方法

  4. 获取类名

  Class studentClass = Student.class;

 //Field 成员变量
Field[] fields = studentClass.getFields(); //只会获取public修饰的成员变量
 for (Field field : fields) {
     System.out.println(field);
}

 Field a = studentClass.getField("a");  //获取名字为a 并且是public修饰的成员变量
 Student student=new Student();
 a.set(student,"张三");   //给student对象 变量名为a的复制张三 public修饰
 System.out.println(student);

 Field[] declaredFields = studentClass.getDeclaredFields(); //获取所有的成员变量 不考虑修饰符
 for (Field declaredField : declaredFields) {
     System.out.println(declaredField);
}

 Field name = studentClass.getDeclaredField("name");
 Student student1=new Student();
 name.setAccessible(true); //暴力反射
 Object o = name.get(student1);  //当get有访问权限的的成员变量 会报 IllegalAccessException异常
 System.out.println(o);

//获取构造
Constructor constructor = studentClass.getConstructor();  //无参构造
 System.out.println(constructor);
 Object o = constructor.newInstance();    //通过构造 获取对象
 System.out.println(o);

 Constructor constructor1 = studentClass.getConstructor(String.class, Integer.class);  //有参构造
 Object o1 = constructor1.newInstance("张三", 1);   //有参构造 获取对象
 System.out.println(o1);

 Student student2 = new Student();
 //获取方法
 Method eat = studentClass.getMethod("eat"); //获取方法
 Object invoke = eat.invoke(student2);  //调用方法

 Method eat1 = studentClass.getMethod("eat",String.class); //获取方法 参数String 类型
 Object invoke1 = eat1.invoke(student2,"张三");  //调用方法

 studentClass.getDeclaredMethods();//只会获取自己的方法 不会获取父类的
 Method[] declaredMethods = studentClass.getMethods();  //获取所有的方法包括父类
 for (Method declaredMethod : declaredMethods) {
     System.out.println(declaredMethod );
     System.out.println(declaredMethod.getName());  //获取方法的名字
}
posted @ 2020-03-02 20:55  眯眯  阅读(149)  评论(0)    收藏  举报