A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一:反射的概念反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的方法,属性,构造方法等成员。
反射的前提:必须先要获取到该类的字节码文件对象,即Class类型对象
反射的实现:

二:获取Class对象三种方式:
1)通过类名.class获取
举例:
[Java] 纯文本查看 复制代码
 public void test1() {
        // 方式一 : 通过类名获取 class 对象
        // 格式 : 类名.class 属性
        // 常用场景 : 反射获取方法时, 确定方法的形参列表类型
        Class<Student> cls = Student.class;
        System.out.println("cls = " + cls);
    }

2)通过Object类的成员方法getClass()方法获取,对象名.getClass()
3)通过Class.forName("类的全路径名")获取,即Class.forName("cn.itcast.test2.Student");

举例:
[Java] 纯文本查看 复制代码
 public void test3() throws ClassNotFoundException {
        // 方式三 : 使用 Class 调用静态方法 forName(全限定类名);   `包名+类名`
        // 使用场景 : 加载外部的配置文件时使用
        Class<?> cls = Class.forName("cn.itcast.test.Student");
        System.out.println("cls = " + cls);
    }

三:[size=1.5em]Class对象相关方法
String getSimpleName(); 获得简单类名,只是类名,没有包   
String getName(); 获取完整类名,包含包名+类名   
T newInstance() ;创建此 Class 对象所表示的类的一个新实例。
要求:类必须有public的无参数构造方法(已过时,一般用class.getConstructor().newInstance()方法)

举例:
[Java] 纯文本查看 复制代码
 public void testDate1() throws Exception {
        // 1. 获取 Date 表示的 Class 对象.
        Class<?> cls = Class.forName("java.util.Date");
        // 2. 获取简单类名
        String simpleName = cls.getSimpleName();
        System.out.println("simpleName = " + simpleName);
        // 3. 获取完成名称 (包名 + 类名)
        String name = cls.getName();
        System.out.println("name = " + name);
        // 3. 创建一个日期对象
        // cls.newInstance(); 已过时.
        Object obj = cls.getDeclaredConstructor().newInstance();
        System.out.println("obj = " + obj);
    }

四:Class类中与Constructor相关方法:

1. Constructor getConstructor(Class... parameterTypes)
    根据参数类型获取构造方法对象,只能获得public修饰的构造方法。
    如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。
2. Constructor getDeclaredConstructor(Class... parameterTypes)
      根据参数类型获取构造方法对象,包括private修饰的构造方法。
      如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。
3. Constructor[] getConstructors()    获取所有的public修饰的构造方法
4. Constructor[] getDeclaredConstructors()     获取所有构造方法,包括privat修饰的

Constructor类中的常用方法:
1. T newInstance(Object... initargs)
      根据指定参数创建对象。
2. void setAccessible(true)
      暴力反射,设置为可以直接访问私有类型的构造方法。

五:Class类中与Method相关的方法:
1. Method getMethod("方法名", 方法的参数类型... 类型)  
    根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
2. Method getDeclaredMethod("方法名", 方法的参数类型... 类型)
      根据方法名和参数类型获得一个方法对象,包括private修饰的
3. Method[] getMethods() (了解)
      获取所有的public修饰的成员方法,包括父类中。
4. Method[] getDeclaredMethods() (了解)
      获取当前类中所有的方法,包含私有的,不包括父类中。
Method类中常用方法

1.  Object invoke(Object obj, Object... args)
          根据参数args调用对象obj的该成员方法       
          如果obj=null,则表示该方法是静态方法
2.  void setAccessible(boolean flag)
          暴力反射,设置为可以直接调用私有修饰的成员方法
六:Class类中与Field相关方法

1. Field getDeclaredField(String name)
   根据属性名获得属性对象,包括private修饰的
2. Field getField(String name)
   根据属性名获得属性对象,只能获取public修饰的  
3. Field[]        getFields()
    获取所有的public修饰的属性对象,返回数组。  
4. Field[]        getDeclaredFields()
    获取所有的属性对象,包括private修饰的,返回数组。
Field类中常用方法

1. void set(Object obj, Object value)
Object get(Object obj)  
2. void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属性。
Class getType(); 获取属性的类型,返回Class对象。


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马