反射机制: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");