反射的作用
在不修改源码的情况下,扩展功能。
步伐在运行的时期,通过反射机制,获取类的所有内部信息,并且利用类的对象。
Class类
- 一个类在堆中只有一个Class对象,这个Class对象包含了类的完整结构信息
- 反射技能是针对Class对象举行利用,在步伐运行的时候,动态获取类中的所有成员
[1] Class类 常用方法
通过类的全路径名 获取Class对象
获取类加载器
获取实例对象
获取构造器对象
获取成员属性对象
获取成员方法对象
[2] 获取Class类对象
获取Class类对象的4种方式
根本类型和包装类型的Class对象
- int.class
- char.class
- Integer.TYPE
- Charater.TYPE
其它类型的Class对象
Constructor类
创建实例对象- //获取Class类对象
- Class<?> clazz = Class.forName(className);
- //获取空参构造器对象
- Constructor<?> constructor = clazz.getConstructor();
- Student stu= (Student)constructor.newInstance();
- //获取有参构造器对象
- Constructor<?> constructor = clazz.getConstructor(String.class,int.class);
- Student stu= (Student)constructor.newInstance("www", 50);
复制代码 Field类
- 设置值:set( 实例对象, 值 )
- 获取值:get( 实例对象 )
- 静态属性:set( null, 值 ) / get( null )
Method类
使用反射的步骤
应用实例
[1] 使用反射 - 创建对象
- //1.获取User类的Class对象
- Class<?> cls = Class.forName("com.java.test.Student");
- //2.无参构造器创建对象
- Object o = cls.newInstance();
- //3.有参构造器创建对象
- Constructor<?> constructor = cls.getConstructor(int.class, String.class);
- Object o2 = constructor.newInstance(1000, "hello");
- //4.私有有参构造器创建对象
- Constructor<?> declaredConstructor = cls.getDeclaredConstructor(String.class);
- declaredConstructor.setAccessible(true);
- Object o3 = declaredConstructor.newInstance("jack");
复制代码 [2] 使用反射 - 利用属性
- //获取Class对象
- Class<PrivateTest> cls = PrivateTest.class;
- //使用Class类对象,创建实例对象
- PrivateTest o = cls.newInstance();
- //获取指定的字段对象
- Field nameFieldObj = cls.getDeclaredField("name");
- nameFieldObj.setAccessible(true);
- nameFieldObj.set(o,"汪汪");
- //获取指定的方法对象
- Method getNameObj = cls.getMethod("getName");
- System.out.println(getNameObj.invoke(o));
复制代码 [3] 使用反射 - 调用方法
- 获取Class类对象
- 获取所有的成员方法对象:getDeclaredMethods( )
- 取消访问查抄:setAccessible(true);
- 调用方法:invoke( )
[4] 通过设置文件,创建对象并调用方法
设置文件- classfullpath=com.reflectiontest.demo.domain.Cat
- method=hi
- name=zhangsan
- age=19
复制代码 main方法- //1. 通过类加载器读取src目录下的配置文件
- // 获取类加载器
- ClassLoader clazzLoader = DemoTest02.class.getClassLoader();
- // 读取配置文件
- InputStream is = clazzLoader.getResourceAsStream("stu.ini");
- Properties pro = new Properties();
- pro.load(is);
- String classfullpath = pro.getProperty("classfullpath");
- String method = pro.getProperty("method");
- String name = pro.getProperty("name");
- int age = Integer.parseInt(pro.getProperty("age"));
- //2.使用反射技术
- //根据全类名获取Class对象
- Class<?> cls = Class.forName(classfullpath);
- //通过Class类 获取对象实例
- Object o = cls.newInstance();
- //获取空参构造器对象
- Constructor<?> constructor = clazz.getConstructor();
- Student stu= (Student)constructor.newInstance();
- //获取有参构造器对象
- Constructor<?> constructor = clazz.getConstructor(String.class,int.class);
- Student stu= (Student)constructor.newInstance("www", 50);
- //操作属性
- System.out.println("--通过Field对象获取私有属性的值--");
- Field nameObj = cls.getDeclaredField("name");
- nameObj.setAccessible(true);
- System.out.println(nameObj.get(o));//获取属性的值
- nameObj.set(o,"newName");//设置属性的值
-
- //操作方法
- //获取Method对象
- Method methodObj1 = cls.getMethod(method);
- //通过Method对象调用方法
- methodObj1.invoke(o);
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |