欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

学习笔记—反射

程序员文章站 2022-04-09 19:02:15
反射的概念和作用 概念 动态获取信息以及动态调用对象方法的一种反射机制。可以在程序运行时动态的获取类的属性、方法和构造器。 作用 可以动态的创建对象,不需要导入类的所在包,只需要知道类的完整路径就可以知道该类中的所有信息。 反射获取类的三种方式 1、根据全限定路径获取 2、根据对象获取 3、根据类名 ......

反射的概念和作用

概念

  动态获取信息以及动态调用对象方法的一种反射机制。可以在程序运行时动态的获取类的属性、方法和构造器。

作用

  可以动态的创建对象,不需要导入类的所在包,只需要知道类的完整路径就可以知道该类中的所有信息。

 

反射获取类的三种方式

1、根据全限定路径获取

class.forname("路径");

2、根据对象获取

对象名.getclass();

3、根据类名获取

类名.class;

 注意:一个类只有一个类对象。

常用方法:

        system.out.println("获取类对象的包名:" + c.getpackage());
        system.out.println("获取类的修饰符:" + c.getmodifiers());
        system.out.println("获取类的名称(全限定):" + c.getname());
        system.out.println("获取类的名称(类名):" + c.getsimplename());
        system.out.println("获取类的父类的类对象:" + c.getsuperclass());

 

反射操作属性

获取该类及其所有父类的所有公共字段

// 获取该类及其所有父类的所有公共字段
field[] fields = c.getfields();        
for(field f : fields) {
    system.out.println("获取属性名:" + f.getname());
    system.out.println("获取修饰符" + f.getmodifiers());
    system.out.println("获取类型" + f.gettype());        //返回的是类型的class对象
}

 获取该类声明的所有字段

        // 获取该类声明的所有字段
        field[] fieldall = c.getdeclaredfields();
        for(field f : fieldall) {
            system.out.println("获取属性名:" + f.getname());
            system.out.println("获取修饰符" + f.getmodifiers());
            system.out.println("获取类型" + f.gettype());        //返回的是类型的class对象
        }

获取指定字段

        // 指定获取类及其父类的公共字段
        field field = c.getfield("pname");    
        
        // 指定获取类的所有字段
        field field2 = c.getdeclaredfield("snull");        
        
        // 指定获取父类声明字段
        field field3 = c.getsuperclass().getdeclaredfield("pname");    

操作类属性

// 操作静态属性
        类属性对象.get(null)        // 返回静态属性的值
        类属性对象.set(null,"值")    // 赋值
// 操作非静态属性
        类属性对象.get(object obj);
        类属性对象.set(object obj,"值");

 

反射操作方法

获取该类及其所有父类的所有公共方法

        // 获取所有的公共方法(包括父类)
        method[] methods = c.getmethods();
        for(method method:methods) {
            system.out.println(method.getname());
        }

获取该类声明的所有方法

        // 获取所有声明的方法(不包括父类)
        method[] methodall= c.getdeclaredmethods();
        for(method method:methodall) {
            system.out.println(method.getname());
        }

获取指定方法

// 获取指定的公共方法
getmethod(string name, class ... cla);

// 获取指定的方法
getdeclaredmethod(string name,class ... cla);

/**  参数
  * string : name   表示方法名
  * class ... cla 表示方法接收的参数类型的类对象
  *
*/