您的位置:首页 > 其它

静态代理与动态代理

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 {

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: