反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
1.首先我们要了解java中的Class类: 其实每当我们编写并编译一个类时,JVM就会创建这个类对应的Class类对象,记录着该类的相关类型信息;并且这个Class对象会保存在同名.class文件里(编译后的字节码文件保存的就是Class对象); 比如Shapes类,它的Class对象保存在Shapes.class里 Shapes类的所有对象,共用一个它的Class对象
2.获取对应类的Class方式 (1)Class c=对象.getClass()
A a=new A();Class c=a.getClass();(2)Class c=类名.Class()
Class c=A.Class();(3)Class c=Class.forName(“类名全路径”)
3.Class类中的常见用方法 一.与构造方法有关的:Constructor类 (1)static Class forName(String className) (2)newInstance()
演示用法:实例化的几种方式 (1)默认构造方法
Class c= Class.forName("com.pojo.Student"); Student student=c.newInstance(); 设置成员值(2)获取带String 参数 public 的构造方法
Class c= Class.forName("com.pojo.Student"); Constructor cs=c.getConstructor(String.Class) Student student=cs.newInstance("wanlong");(3)获取带int参数,String参数,private的构造方法
Class c= Class.forName("com.pojo.Student"); Constructor cs=c.getDeclaredConstructor(int.Class,String.Class) //由于是private,必须设置可以访问 cs.setAccessible(true); Student student=cs.newInstance("wanlong");其他就不演示了:
二:与成员有关的:Field类
演示:
Class c=Class.forName("com.pojo.Student"); //获取成员变量为name且public Field Fname=c.getField("name"); //获得所有成员变量且public (包含父类) Field [] fields=c.getField(); 其他就不演示了;同理 给字段赋值 Student student=c.newInstance(); Fname.set(student,"wanlong");三:与方法有关的类:Method
演示:
Class c=Class.forName("com.pojo.Student"); //获得方法名为add ,参数为int,String类型 public的方法 Method addMethod=c.getMethod("add",int.Class,String.Class); 其他同理:不演示 调用方法 Student student=c.newInstance(); addMethod.invote(student,"1","wanlong");