Java反射总结

概念介绍

Java反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Class类

  • 在Java语言中,静态的成员、普通数据类型不是对象。类是对象,类是java.lang.Class类的实例对象
  • 如何表示?
    Class c1 = Foo.class;
    Class c2 = foo1.getClass(); //foo1是Foo类的实例对象
    Class c3 = Class.forName("com.niaoge2016.Foo");
    // 可以通过Class创建该类的实例对象
    Foo foo1 = (Foo)c1.newInstance();
  • 基本的数据类型
    void等关键字,都存在Class(类类型)

动态加载类
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类。

  • new创建对象是静态加载类,在编译时刻就需要加载所有可能用到的类。
  • 上面的Class.forName("类的全称")不仅表示类的类类型,还代表了动态加载类,只有在运行时刻用到该类时才进行加载。

功能总结

Class类的基本API

Java反射总结_第1张图片
Class类常用方法

Class c = obj.getClass();

  • 获取类的名称
    c.getName();

  • 获取方法

// 获取此Class对象表示的类或接口中指定的公共成员方法
Method m1 = c.getMethod(String name,Object ...); 
// 获取所有的public函数,包括父类继承来的
Method[] ms1 = c.getMethods(); 
// 获取此Class对象表示的类或接口中指定的已声明方法
Method m2 = c.getDeclaredMethod(String name,Object ...);
// 获取所有该类自己声明的方法,不问访问权限(公共,保护,包,私有),不包括从父类继承的方法
Method[] ms2 = c.getDeclaredMethods(); 
  • 获取成员变量
// 获取此Class对象表示的类或接口中指定的公共成员变量
Field f1 = c.getField(String name); 
// 获取所有的public成员变量信息,包括父类继承来的
Field[] fs1 = c.getFields(); 
// 获取此Class对象表示的类或接口中指定的已声明成员变量
Field f2 = c.getDeclaredField(String name);
// 获取所有该类自己声明的成员变量信息,不问访问权限(公共,保护,包,私有),不包括从父类继承的成员变量信息
Field[] fs2 = c.getDeclaredFields(); 
  • 获取类的构造器
// 获取此Class对象表示的类中指定的类构造方法
Constructor c1 = c.getConstructor(Class ...);
// 获取此Class对象表示的类中所有公共的类构造方法
Constructor[] cs1 = c.getConstructors();
// 获取此Class对象表示的类或接口中指定的类构造方法
Constructor c2 = c.getDeclaredConstructor(Class ...);
// 获取此Class对象表示的类的所有类构造方法,不问访问权限(公共,保护,包,私有),不包括从父类继承的类构造方法
Constructor[] cs2 = c.getDeclaredConstructors();
  • 新建类的实例
// 调用类的Class对象的newInstance()方法
Object inst = c.newInstance();
// 调用默认Constructor对象的newInstance()方法
Constructor c3 = c.getConstructor();
Object inst = c3.newInstance();
// 调用带参数的Constructor对象的newInstance()方法
Constructor c4 = c.getDeclaredConstructor(int.class,String.class);
Object inst = c4.newInstance(1,"abc");

方法反射的基本操作

  • 如何获取某个方法
    方法的名称和方法的参数列表才能唯一确定某个方法
  • 方法反射的操作
    m1.invoke(对象,可变参数列表)
    参数列表根据实际情况,可以传数组Object[],也可以传具体参数列表,如:
    m1.invoke(a1,new Object[]{10,20}); 或者
    m1.invoke(a1,10,20);

你可能感兴趣的:(Java反射总结)