day07_反射
来源:互联网 发布:修图师需要学什么软件 编辑:程序博客网 时间:2024/05/18 16:56
一、原理
简介:
- 应用在一些通用性比较高的代码中
- 大多数使用反射来实现 框架
- 在框架开发中,都是基于配置文件开发的
在配置文件中,可以通过反射,得到类中的所有内容,可以让类中的某个方法来执行
原理:
- 把Java文件保存到本地硬盘 .java
- 编译Java文件,成.class文件
- 使用JVM,把class文件通过类加载器加载到内存中
- class文件在内存中,使用class类来表示对象
- 反射:首先,获取class类,其次,得到里面所有内容
- 如何获取?
属性:通过一个类 Filed
构造方法:通过一个类 Constructor
普通方法:通过一个类Method
得到class类的3种方式:
- 类名.class
- 对象.getClass()
- 使用Class.forName(“路径”)
二、使用反射操作无参构造方法
//操作无参构造方法@Testpublic void test1() throws Exception { //得到class Class c3 = Class.forName("cn.itcast.test06.Person"); //得到Person类的实例 Person p = (Person) c3.newInstance(); p.setId(1500); System.out.println(p.getId());}
对一个对象实例化,可以new ,不使用new的话,可以如下操作:
//得到class Class c3 = Class.forName("cn.itcast.test06.Person"); //得到Person类的实例 Person p = (Person) c3.newInstance();
三、使用反射操作有参构造方法
//操作有参构造方法@Testpublic void test2() throws Exception { //得到class Class c1 = Class.forName("cn.itcast.test06.Person"); //使用有参构造方法 //c1.getConstructors();//获取所有的构造方法 //穿肚有参数的构造方法里面的参数类型,类型使用class形式传递 Constructor cs = c1.getConstructor(String.class,String.class); //通过有参数的构造方法,设置值,创建Person实例 Person p1 = (Person) cs.newInstance("jingvjing","100"); System.out.println(p1.getId()+":"+p1.getName()); }
四、使用反射操作name属性
@Test//操作name属性public void test3() throws Exception { try{//得到class Class c3 = Class.forName("cn.itcast.test06.Person"); //得到name属性 //c3.getDeclaredFields();//获取所有属性 //得到person实例 Person p11 = (Person)c3.newInstance(); Field f1 = c3.getDeclaredField("name"); //设置可以操作私有属性,不让操作时,使用这个 f1.setAccessible(true); //设置name值[实例,值] f1.set(p11, "wujing"); System.out.println(p11.getName()); }catch(Exception e) { e.printStackTrace(); }}
五、使用反射操作普通方法
//操作方法@Testpublic void test4() throws Exception {//得到class Class c4 = Class.forName("cn.itcast.test06.Person"); //得到实例 Person p12 = (Person)c4.newInstance(); //得到普通方法 //c4.getDeclaredMethods();//得到所有方法 【方法名,方法值】 Method m1 =c4.getDeclaredMethod("setName", String.class); //执行setName方法,设置值 【类的实例,设置值】 m1.invoke(p12,"aoao"); System.out.println(p12.getName()); }
反射操作静态方法时,类名.静态方法,不需要实例。代码为:m1.invoke(null,”aoao”);
阅读全文
0 0
- day07_反射
- day07_ __import__
- day07_广播与服务
- 黑马程序员_Java基础Day07_面向对象之继承(Done)
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 150. Evaluate Reverse Polish Notation
- 图像特征描述子之BRISK
- 7、Queue
- 啊404!
- 外键
- day07_反射
- Troubleshoot Replica Sets
- 8、Deque
- (08)jQuery事件绑定以及解绑
- VB中常用的函数(一)
- 【GDKOI2016】寻宝
- freeswitch mrcp 源码分析--数据接收(下)
- 9、PriorityQueue分析
- 异步Servlet