静态代理与动态代理
2016-08-23 20:37
295 查看
package com.mypro.java;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import org.junit.Test;
/**
*
* @author xuping 1.如何创建Class的实例 Class的一个对象,对应一个运行时类。相当于一个运行时类本身充当一个Class的一个实例。
* java.lang.Class是反射的源头。接下来涉及到的反射的类都在java.lang.reflect下,如:filed、Method、
* Constructor Type Package
* 当通过Class的实例调用getMethods()–>Method,getConstructor–>Constructor
* 实例化CLass的三种方法: a)调用运行时类的class属性 Class clazz1 = Person.class;
* b)通过运行时类对象,调用其getClass方法 Person p = new Person(); Class clazz2 =
* p.getClass(); c)调用Class的静态方法forName(String
* className),此方法会报出ClassNotFoundException的异常,所以注意抛出异常 String className
* = “com.atguigu.java.Person”; Class clazz3 = Class.forName(className)
* 2.有了Class实例以后,做什么? a)可以创建对应的运行时对象
* //获取运行时类的对象:方法一:
@Test
public void test1() throws Exception {
Class clazz = Class.forName(“com.mypro.java.Animal”);
Object obj = clazz.newInstance();
Animal a = (Animal)obj;
System.out.println(a);
}
//获取运行时类的对象:方法二:
@Test
public void test2() throws Exception {
//调用指定的构造器创建运行时类对象,非public的情况下,使用get,DeclaredConstructor,cons.setAccessible(true)设置可以操作性
Class clazz = Animal.class;
Constructor cons = clazz.getDeclaredConstructor(String.class,int.class);
cons.setAccessible(true);
Animal a = (Animal)cons.newInstance(“Tom”,20);
System.out.println(a);
}
* b)获取对应的运行时类的完整的类的结构:属性、方法、构造器、包、父类、接口、反醒、注解、异常等等 如:Method[]m1 =
* clazz.getMethods():获取对应的运行时类中权限为public的方法也包括其父类中证明的public的方法
* Method[]m2 =
* clazz.getDeclareMethods():获得对应的运行时类的所有的方法(任何权限的修饰符都能获得,并且不能获得父类中的方法)
* //调用指定的运行时类的指定属性,调用私有的属性时,要f1.setAccessible(true);
@Test
public void test3() throws Exception {
Class clazz = Class.forName(“com.mypro.java.Animal”);
Object obj = clazz.newInstance();
Animal a = (Animal)obj;
Field f1 = clazz.getDeclaredField(“name”);
f1.setAccessible(true);
f1.set(a, “wangjian”);
System.out.println(a);
System.out.println(f1.get(a));
//调用static属性
Field f3 = clazz.getDeclaredField(“desc”);
System.out.println(f1.get(Animal.class));
}
*
* c)调用对应的运行时类中指定的结构(某一个指定的属性、方法、构造器) d)动态代理--反射的应用,体会反射的动态型
* 静态代理:要求被代理类和代理类同时实现相应的一套接口;通过被代理类的对象调用重写接口的方法时,实际上执行的时被代理的同样的方法的调用。
* 动态代理:在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类。当调用代理类实现的抽象方法时,发起对代理类的同样的方法的调用。
* 涉及到技术点:1.提供一个实现了InvocationHandle接口实现类,并重写其invoke方法---调用代理类实现的抽象方法时,发起对代理类的同样的方法的调用
* 2.Proxy.newInstance()—在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类。
* 三个参数:obj 被加载类的类加载器
* Proxy.newInstance(obj.getClass.getClassLoader(),obj.getInterfaces,h)//obj被代理类的对象,h是实现了InvocationHandle类的对象
*/
public class java3 {
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import org.junit.Test;
/**
*
* @author xuping 1.如何创建Class的实例 Class的一个对象,对应一个运行时类。相当于一个运行时类本身充当一个Class的一个实例。
* java.lang.Class是反射的源头。接下来涉及到的反射的类都在java.lang.reflect下,如:filed、Method、
* Constructor Type Package
* 当通过Class的实例调用getMethods()–>Method,getConstructor–>Constructor
* 实例化CLass的三种方法: a)调用运行时类的class属性 Class clazz1 = Person.class;
* b)通过运行时类对象,调用其getClass方法 Person p = new Person(); Class clazz2 =
* p.getClass(); c)调用Class的静态方法forName(String
* className),此方法会报出ClassNotFoundException的异常,所以注意抛出异常 String className
* = “com.atguigu.java.Person”; Class clazz3 = Class.forName(className)
* 2.有了Class实例以后,做什么? a)可以创建对应的运行时对象
* //获取运行时类的对象:方法一:
@Test
public void test1() throws Exception {
Class clazz = Class.forName(“com.mypro.java.Animal”);
Object obj = clazz.newInstance();
Animal a = (Animal)obj;
System.out.println(a);
}
//获取运行时类的对象:方法二:
@Test
public void test2() throws Exception {
//调用指定的构造器创建运行时类对象,非public的情况下,使用get,DeclaredConstructor,cons.setAccessible(true)设置可以操作性
Class clazz = Animal.class;
Constructor cons = clazz.getDeclaredConstructor(String.class,int.class);
cons.setAccessible(true);
Animal a = (Animal)cons.newInstance(“Tom”,20);
System.out.println(a);
}
* b)获取对应的运行时类的完整的类的结构:属性、方法、构造器、包、父类、接口、反醒、注解、异常等等 如:Method[]m1 =
* clazz.getMethods():获取对应的运行时类中权限为public的方法也包括其父类中证明的public的方法
* Method[]m2 =
* clazz.getDeclareMethods():获得对应的运行时类的所有的方法(任何权限的修饰符都能获得,并且不能获得父类中的方法)
* //调用指定的运行时类的指定属性,调用私有的属性时,要f1.setAccessible(true);
@Test
public void test3() throws Exception {
Class clazz = Class.forName(“com.mypro.java.Animal”);
Object obj = clazz.newInstance();
Animal a = (Animal)obj;
Field f1 = clazz.getDeclaredField(“name”);
f1.setAccessible(true);
f1.set(a, “wangjian”);
System.out.println(a);
System.out.println(f1.get(a));
//调用static属性
Field f3 = clazz.getDeclaredField(“desc”);
System.out.println(f1.get(Animal.class));
}
*
* c)调用对应的运行时类中指定的结构(某一个指定的属性、方法、构造器) d)动态代理--反射的应用,体会反射的动态型
* 静态代理:要求被代理类和代理类同时实现相应的一套接口;通过被代理类的对象调用重写接口的方法时,实际上执行的时被代理的同样的方法的调用。
* 动态代理:在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类。当调用代理类实现的抽象方法时,发起对代理类的同样的方法的调用。
* 涉及到技术点:1.提供一个实现了InvocationHandle接口实现类,并重写其invoke方法---调用代理类实现的抽象方法时,发起对代理类的同样的方法的调用
* 2.Proxy.newInstance()—在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类。
* 三个参数:obj 被加载类的类加载器
* Proxy.newInstance(obj.getClass.getClassLoader(),obj.getInterfaces,h)//obj被代理类的对象,h是实现了InvocationHandle类的对象
*/
public class java3 {
}
相关文章推荐
- POJ 2769 Reduced ID Numbers
- Android 从相册选取多张照片
- 【校内互侧】Sunshine’s city (lct+线段树)
- Handler Looper Messagequeue Message 细节以及关系
- Docker简介(未完)
- // 组成一个没有重复元素的数组范围是1~10
- 求一个区间有多少个数能整除k
- MyEclipse8.5快速搭建SSH框架
- RN发送接收事件--原生模块
- 深入理解PHP原理之PHP脚本执行原理(1)
- tcpdump
- ASCII-转义字符
- [转]ACM 取石子问题
- 动态添加ImageView控件并在其上实现动画
- AngularJS绑定数据
- 167. Two Sum II - Input array is sorted
- call apply方法
- 数据结构实验之查找四:二分查找
- 中南大学2016年校队选拔赛第一场Problem D
- 167. Two Sum II - Input array is sorted