反射
基本概念
动态语言&静态语言
动态语言:一类在运行时可以改变其结构的语言。Object-C, C#, JavaScript, PHP, Python等
动态语言:运行时结构不可变的语言。Java, C, C++等
Java应该被称为“准动态语言”,我们可以利用反射机制获得类似动态语言的特性
反射方式
- 正常方式
- 引入需要的“包类”名称
- 通过new实例化
- 取得实例化对象
- 反射方式
- 实例化对象
- getClass()方法
- 得到完整的“包类”名称
Class类
- Class本身也是一个类
- Class对象只能由系统创建对象
- 一个加载的类在JVM中只会有一个Class实例
- 通过Class可以完整地得到一个类中的所有被加载的结构
- Class类是Reflection的根源,针对任何想动态加载、运行的类,必须先获得相应的Class对象
如何得到Class类
Person person = new Student();
//方式一:通过对象获得
Class c1 = person.getClass();
System.out.println(c1.hashCode());
//方式二:通过forName获得
Class c2 = Class.forName("com.test.Student");
System.out.println(c2.hashCode());
//方式三:通过类名.class获得
Class c3 = Student.class;
System.out.println(c3.hashCode());
获得类的信息
Class c1 = Class.forName("com.User");
//获取类的名字
c1.getName();//包名+类名
c1.getSimpleName();//类名
//获取类的属性
Field[] fields = c1.getFields();//public属性
fields = c1.getDeclaredFields();//全部属性
//获得类的方法
c1.getMethods();//获得本类及其父类全部的public方法
c1.getDeclaredMethods();//获得本类的全部方法
c1.getMethods("getName",null);//获得本类指定的方法
//获取构造器
c1.getDeclaredConstructor(String.class,int.class,int.class);//获取指定的构造器
动态创建对象执行方法
创建类的对象:调用Class对象的newInstance()方法
//获得Class对象
Class c1 = Class.forName("com.User");
//构造一个对象
User user = (User)c1.newInstance();
//通过构造器创建对象
Constructor constructor = c1.getDeclaredConstructor(String.class,int.class,int.class);
User user2 = (User)constructor.newInstance("Arron",001,18);
//通过反射获取一个方法
Method setName = c1.getDeclaredMethod("setName",String.class);
// invoke(对象,“方法的值”):激活
setName.invoke(user,"Arron12");