java-反射和代理
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-反射和代理的更多相关文章
- 【译】11. Java反射——动态代理
原文地址:http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html 博主最近比较忙,争取每周翻译四篇.等不急的请移步原文网页. ...
- Java反射与代理
Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC.AOP就是通过反射机制与动态代理实现的. 1 Java反射 示例: User user = new User( ...
- java 反射 动态代理
在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...
- 深入理解Java反射+动态代理
答: 反射机制的定义: 是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为j ...
- java反射和代理
这一篇我们说说反射和动态代理,为什么这两个要一起说呢?因为动态代理中会用到反射,而且java中反射的用处太多了,基本上无处不在,而且功能十分强大: 1.反射简介 反射是什么呢?一般都是很专业的说法:在 ...
- java反射与代理模式
流程age: 饭前洗手----> 吃饭 --->饭后洗碗 //吃饭 public interface Dinner { //吃饭方法 public void haveDinner(); } ...
- 【对线面试官】Java 反射&&动态代理
// 抽象类,定义泛型<T> public abstract class BaseDao<T> { public BaseDao(){ Class clazz = this.g ...
- Java 反射机制学习资料
Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...
- Java反射——引言
Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...
- 【译】1. Java反射——引言
原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...
随机推荐
- 初学者配置第一个spring mvc Demo
1.web.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi= ...
- win8中如何设定editplus为txt默认打开程序
设定EditPlus为TXT默认打开方式吧. 首选,打开我们的EditPlus 接着,点击[工具]菜单,点击[参数设置]这个菜单项 来到设定界面 找到[设置&语法]这个选项,然后可以看到里面有 ...
- 内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc
很多地方都会使用内存,内存使用过程中操作不当就容易崩溃,无法运行程序,上网Google学习一下,了解整理下他们之间的区别以及使用 ,获益匪浅 0x01 各自的定义和理解 (1)先看GlobalAllo ...
- Axis Java调C# Webservice
这是一个痛苦的过程,如果java对java的webservice可以说很方便,很简单,Axis,CXF等一系列框架生成客户端直接传参调用即可,但是异构语言就有点麻烦了,生成的客户端不好使......无 ...
- React 表单组件
诸如 <input>.<textarea>.<option> 这样的表单组件不同于其他组件,因为他们可以通过用户交互发生变化.这些组件提供的界面使响应用户交互的表单 ...
- JS的定时到底有多不准
博客逐步迁移到,独立博客,原文地址,http://www.woniubi.cn/js_hide_tab_setinterval/ 我们一直都在说,JS的定时非常的不准确,但是很少有人去验证他,今天我就 ...
- linux服务器tomcat启动时,不能加载项目
---恢复内容开始--- 问题描述:tomcat启动时候,能够成功启动但是项目不能加载,查看catalina.out后出现以下的错误 due to a StackOverflowError. Poss ...
- ownCloud-9.1.1 (Ubuntu 16.04)
平台: Ubuntu 类型: 虚拟机镜像 软件包: owncloud-9.1.1 commercial content management open-source owncloud storage ...
- day004-Map类
1.Map集合概述 Map是一个接口,只要是实现了该接口的类就是一个双列集合. 双列集合就是每次存储元素时需要存储两个元素的集合. 这两个元素称为键值对, Key Value ==>映射关系 特 ...
- ASP.NET Core - 各项配置
之前搭建好了各项开发环境,现在来说说ASP.NET Core的各项配置.项目结构.以及在请求管道中挂载的各式各样的中间件.今天先来探讨探讨其各项配置及其项目结构 ASP.NET Core和上一代F ...