文章目录
- 一、注意点
- 1.获取Class实例的三种常见方式
- 2.对Class类的理解
- 3.创建Class对应运行时类的对象的通用方法,代码实现。以及这样操作,需要对应的运行时类构造器方面满足的要求
- 二、静态代理举例
- 代码
- 三、动态代理举例
提示:以下是本篇文章正文内容,下面案例可供参考
一、注意点
1.获取Class实例的三种常见方式
Class clazz1 = String.class;Class clazz2 = person.getClass(); //sout(person); //xxx.yyy.zzz.Person@...Class clazz3 = Class.forName(String classPath);//体现反射的动态性
2.对Class类的理解
Class实例对应着加载到内存中的一个运行时类。
3.创建Class对应运行时类的对象的通用方法,代码实现。以及这样操作,需要对应的运行时类构造器方面满足的要求
Object obj = clazz.newInstance();//创建了对应的运行时类的对象
1.必须有空参的构造器
2.权限修饰符的权限要够。通常设置为public
二、静态代理举例
代码
package com.tyust.edu;/*** 静态代理举例* 特点:代理类和被代理类在编译期间,就确定下来了* @author YML TYUST-XDU 2019-2026* @create 2023-10-09 8:02*/
interface ClothFactory{void produceCloth();
}//代理类
class ProxyClothFactory implements ClothFactory{private ClothFactory factory;//用被代理类对象进行实例化public ProxyClothFactory(ClothFactory factory){this.factory = factory;}public void produceCloth() {System.out.println("代理工厂做一些准备工作");factory.produceCloth();System.out.println("代理工厂做一些后续的收尾工作");}
}//被代理类
class NikeClothFactory implements ClothFactory{public void produceCloth() {System.out.println("Nike工厂生产一批运动服");}
}public class StaticProxyTest {public static void main(String[] args) {//创建被代理类的对象ClothFactory nike = new NikeClothFactory();//创建代理类的对象ClothFactory proxyClothFactory = new ProxyClothFactory(nike);proxyClothFactory.produceCloth();}
}
三、动态代理举例
代码如下(示例):
package com.tyust.edu;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 动态代理的举例* @author YML TYUST-XDU 2019-2026* @create 2023-10-09 7:56*/
interface Human{String getBelief();void eat(String food);
}//被代理类
class SuperMan implements Human{public String getBelief() {return "I believe I can fly!";}public void eat(String food) {System.out.println("我喜欢吃"+ food);}
}class ProxyFactory{public static Object getProxyInstance(Object obj){MyInvocationHandler handler = new MyInvocationHandler();handler.bind(obj);return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);}
}
class MyInvocationHandler implements InvocationHandler{private Object obj;//需要用被代理类的对象进行赋值public void bind(Object obj){this.obj = obj;}//当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法: invoke()//将被代理类要执行的方法a的功能就声明在invoke()中@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//method: 即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法//obj:被代理类的对象Object returnValue = method.invoke(obj,args);上述方法的返回值就作为当前类中的invoke()的返回值return returnValue;}
}public class ProxyTest {public static void main(String[] args) {SuperMan superMan = new SuperMan();//proxyInstance:代理类的对象Human proxyInstance = (Human)ProxyFactory.getProxyInstance(superMan);//当通过代理类对象调用方法时,会自动的调用被代理类中同名的方法String belief = proxyInstance.getBelief();System.out.println(belief);proxyInstance.eat( "四川麻辣烫");System.out.println("*********************************");NikeClothFactory nikeClothFactory = new NikeClothFactory();ClothFactory proxyClothFactory = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory);proxyClothFactory.produceCloth();}}