反射和代理
2018-08-02 05:54:10来源:博客园 阅读 ()
1、类的编译和运行简易过程:
- java的源码文件(也称为编译单元,以.java为后缀的文件)
↓ 文件内最多只能有一个public修饰的类,否则编译器报错;某个类被public修饰,该类名必需与文件名称一致;
- java的字节码文件(以.class为后缀的文件)
↓ 源码文件经过编译器编译后产生的字节码文件,源码文件中的每个类都会产生一个与类名相同的字节码文件
- java虚拟机解析字节码文件
加载.class文件,在内存里保持Class对象,它被用来创建这个类的所有对象。
2、获取Class对象的途径
- Class.forName()
- 已知某个对象w,通过w.getClass()方法获取,该方法在Object中
- 普通的类、接口、数组、基本数据类型,可以通过 .class的形式获取,如char.class、Petty.class
3、反射--运行时的类型信息
什么是反射:程序在运行时候,可以通过类型信息获取类的域、方法、构造器等细节,通过java的反射API可以调用这些域、方法、构造器等
反射的API在java.lang.reflect类库,Class类的实例表示正在运行的 Java 应用程序中的类和接口,因此可以获取Field、Method、Constructor类的对象等信息
4、反射应用--动态代理(jdk版)
- 先看看静态代理:
package com.leixingxinxi; public class Main {
public static void main(String[] args) { TestFace testFace=new Person1(); new Persion2(testFace).testDo(); } } interface TestFace{ void testDo(); } class Person1 implements TestFace{ public void testDo() { System.out.println("去买一杯咖啡..."); } } class Persion2 implements TestFace{ TestFace testFace; public Persion2(TestFace testFace){ this.testFace=testFace; } public void testDo() {
//方法前的操作 testFace.testDo();
//方法后的操作 } }
直接调用方法:可以新建对象Persion1并执行testDo()方法,能够得到一致的结果;------>>>main 让 persion1去买一杯咖啡;
使用静态代理:被代理类和代理类都实现了同一个接口,将被代理类的对象注入代理类的对象域中,在代理类中重写的方法里通过被代理类对象调用对应的方法,实际使用不直接使用被代理类的方法,而是通过代理类的对象调用覆盖的方法;那么在代理类中调用的方法里,真正去调用被代理类的方法前后可以做一些操作------>>>main 告诉persion2 去买咖啡,persion2通知persion1去买一杯咖啡
- 动态代理(jdk版):动态的创建了代理对象,并动态的处理对所代理的方法的调用。
package com.leixingxinxi; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Main { public static void main(String[] args) { TestFace proxy= (TestFace) Proxy.newProxyInstance(Persion1.class.getClassLoader(),Persion1.class.getInterfaces(), new MyInvocationHandler(new Persion1())); proxy.testDo(); } } interface TestFace{ void testDo(); } class Persion1 implements TestFace{ public void testDo() { System.out.println("去买一杯咖啡..."); } } class MyInvocationHandler implements InvocationHandler{ private TestFace testFace; public MyInvocationHandler(TestFace testFace){ this.testFace=testFace; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //调用被代理对象的方法前的业务 System.out.println("当前调用的方法为:"+method.getName()); //调用被代理对象方法 method.invoke(testFace); //调用被代理对象的方法后的业务 System.out.println("被代理的方法调用结束"); return null; } }
调用过程:通过代理对象proxy调用代理方法时候,实际会去调用MyInvocationHandler 对象的invoke方法,该方法内部会调用Method的invoke方法真正去执行被代理对象的方法体
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:初识 Java-监听器
下一篇:STS 重写父类方法的操作
- 代理项 Surrogate 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
- Java--反射(框架设计的灵魂) 2020-06-11
- Java连载120-反射机制获取构造方法和父类、父接口 2020-06-05
- CGLIB动态代理机制,各个方面都有写到 2020-06-04
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash