静态代理与动态代理

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 {

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值