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的反射机制使得它可以在运行时检查类.接 ...
随机推荐
- Tomcat实现Session共享
一个Tomcat中有多一个web应用,然后想共享session,只需在host中加上 <Valve className="org.apache.catalina.authenticat ...
- JQuery Dialog对话框 不能通过Esc关闭
背景:想通过Esc键关闭展示中的Dialog对话框,发现有些对话框可以,有些会失效. 原因分析: 1.对话框上可以输入内容的标签元素可以,反之不行. 2.如果鼠标点击对话框后,也可以Esc键关闭. 可 ...
- centos7服务器搭建javaweb运行环境及代码部署
之前在一直在学习java web终于写完了第一个小demo,于是在阿里云上买了一个服务器,开始了配置服务器环境的踩坑之旅.... ps:本文不讨论服务器配置的具体步骤,网上都很多,按部就班就是,本文主 ...
- 一步步理解typedef
1.如何用C语言实现一个函数,传递两个整形数,返回两个数的和? #include<stdio.h> int add(int a,int b) { return a+b; } void ma ...
- 将Android工程打成jar包之后对资源的调用。
Android工程不能完整的打包成jar包.这个主要是R文件导致的,但是我们可以将除了资源文件中的所有东西都打到jar包中.Activity.View等等类. 提供jar包的同时,还需要提供资源文件. ...
- MyEclipse内存溢出问题
今天碰到的问题,先记录下来 Console报错: Java.lang.OutOfMemoryError: PermGen space 跟着步骤: 在这里加入:-Xms800m -Xmx800m -XX ...
- 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)(转)
这篇文章给大家介绍关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)的相关资料,还给大家收集些关于MySQL会出现中文乱码原因常见的几点,小伙伴快来看看吧 最近两天做项目总是被乱码问题困 ...
- 2017.9.23 HTML学习总结----JavaScript实现输入验证
定义:对于一个HTML页面中的表单,可以获取其中的各项表单域信息, 利用这些信息,可以判定个表单域所提供的输入值是否合法,是否 符合所要求的格式,这就是表单的输入验证. (1)需要验证的表单输入域的要 ...
- WinSCP 工具
windows 与 Linux 传文件,非常方便.安全.
- 遍历ResultSet,行列要从1开始
为什么遍历ResultSet,行列要从1开始. 因为Resultset的第一行的第一列都是空的,要用rs.next()到第一行才能进行读取. Statement stmt=null; ResultS ...