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方法真正去执行被代理对象的方法体

java-反射和代理的更多相关文章

  1. 【译】11. Java反射——动态代理

    原文地址:http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html 博主最近比较忙,争取每周翻译四篇.等不急的请移步原文网页. ...

  2. Java反射与代理

    Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC.AOP就是通过反射机制与动态代理实现的. 1       Java反射 示例: User user = new User( ...

  3. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

  4. 深入理解Java反射+动态代理

    答:   反射机制的定义: 是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为j ...

  5. java反射和代理

    这一篇我们说说反射和动态代理,为什么这两个要一起说呢?因为动态代理中会用到反射,而且java中反射的用处太多了,基本上无处不在,而且功能十分强大: 1.反射简介 反射是什么呢?一般都是很专业的说法:在 ...

  6. java反射与代理模式

    流程age: 饭前洗手----> 吃饭 --->饭后洗碗 //吃饭 public interface Dinner { //吃饭方法 public void haveDinner(); } ...

  7. 【对线面试官】Java 反射&&动态代理

    // 抽象类,定义泛型<T> public abstract class BaseDao<T> { public BaseDao(){ Class clazz = this.g ...

  8. Java 反射机制学习资料

    Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...

  9. Java反射——引言

    Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...

  10. 【译】1. Java反射——引言

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...

随机推荐

  1. java实现两个整数相除保留一位小数

    //整数相除 保留一位小数 public static String division(int a ,int b){ String result = ""; float num = ...

  2. maven配置好了之后再次开机找不到命令

    问题: 昨天还运行的好好的,今天突然又报错了, mvn不是内部或外部命令,也不是可运行程序或批处理文件 原因: 环境配置问题,windows7和windows10稍微有一点不一样,对照下面配置看哪里不 ...

  3. HDU5972Regular Number(ShiftAnd算法 bitset)

    题意 题目链接 第一行的\(n\)表示模式串长度为\(n\) 接下来\(n\)行,每行开头有一个整数\(num\)表示匹配串中该位置的字符可以在\(num\)个桅子花出现,接下来输入这\(num\)个 ...

  4. Android5.0以后,materialDesign风格的加阴影和裁剪效果

    5.0以后,materialDesign风格,出现了立体这种概念,高光,阴影,也就是Z轴,凸显层次:同时,裁剪view也变得方便简单了很多. 1,先说说阴影的实现. 方案1:在xml中设置 xml中设 ...

  5. python模块详解 YAML和configparser

    YAML模块 主要用来做配置文件用的. yaml格式: 详细参考官方文档:PyYAML configparser模块 同样是用于生成和修改配置文件用的.格式和mysql一样. 生成配置文件 impor ...

  6. 分布式系统ID生成方案汇总

    在分布式系统中,需要对大量的数据.消息.请求等进行唯一的标识,例如分布式数据库的ID需要满足唯一且多数据库同步,在单一系统中,使用数据库自增主键可以满足需求,但是在分布式系统中就需要一个能够生成全局唯 ...

  7. Azure进阶攻略 | 该如何唤醒你?因内核超时而沉睡的Linux虚拟机!

    周五下午,当你收拾好东西准备下班,奔赴 Happy Hour 时,突然接到开发团队的电话: 对方:伙计救命啊,我在搭建开发环境,但 Azure 上的 Linux 虚拟机无法启动! 你(心里想着:你要加 ...

  8. python从字符串中提取数字,使用正则表达式

    使用正则表达式 import re D = re.findall(r"\d+\.?\d*",line) print(D) -7.23246 10.8959 5.19534 0.06 ...

  9. 如何获得C4C里某个code字段对应的描述信息

    通过我这篇文章介绍的方法使用C4C OData服务去取服务订单数据(Sales Order): 如何用代码的方式取出SAP C4C销售订单创建后所有业务伙伴的数据 https://www.jiansh ...

  10. ABAP Netweaver和Hybris Enterprise Commerce Platform的登录认证

    ABAP Netweaver 在我的博客Learn more detail about Standard logon procedure里有详细介绍. Hybris ECP Hybris Admini ...