获取Class的方式:Class c1 = String.class;(很少用)Class c2 = person.getClass();Class c3 = Class.forName(String classPath);(参数是类的完全限定名,体现反射的动态性)
Class实例对应着加载到内存中的一个运行时类。
创建Class对应运行时类的对象的通用方法,Person类必须要有空参构造函数,且修饰符的权限要够,一般是public的。
创建Class方式:
1、Class.forName("com.jay.ct.Person")
2、new Person().getClass()
3、Person.class
4、Person.class.getClassLoader().loadClass("com.jay.ct.Person")
1 2 3 4 | Class class1 = Class.forName( "com.jay.ct.Person" ); Object obj = class1.getDeclaredConstructor().newInstance(); //java9之后推荐写法 Method show = class1.getMethod( "show" , String. class );<br>show.setAccessible( true ); Object res = show.invoke(obj, "123456" ); //res就是show方法return的值 |
静态代理和动态代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | package com.jay.ct; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicAgentTest { public static void main(String[] args) throws Exception { // 静态代理 // LiNingFac lnFac = new LiNingFac(); // ProxyClothFac pfac = new ProxyClothFac(lnFac); // pfac.produceCloth(); // 动态代理 Constructor<?> cons = Class.forName( "com.jay.ct.LiNingFac" ).getDeclaredConstructor(); cons.setAccessible( true ); Object lnFac = cons.newInstance(); Object obj = ProxyFac.getProxyInstance(lnFac); ClothFac fac = (ClothFac) obj; fac.produceCloth(); } } interface ClothFac { void produceCloth(); } //动态代理类,绑定被代理类对象,注册invoke方法,返回代理类对象 class ProxyFac { // 参数 obj 是被代理类对象,返回的是代理类对象 public static Object getProxyInstance(Object obj) { // 注册被代理类的invoke方法 ProxyInvocationHandler ih = new ProxyInvocationHandler(); ih.bind(obj); Object p = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), ih); return p; } } //重写被代理类invoke方法 class ProxyInvocationHandler implements InvocationHandler { private Object obj; public void bind(Object obj) { this .obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object res = method.invoke(obj, args); return res; } } //静态代理类 class ProxyClothFac implements ClothFac { public ProxyClothFac(ClothFac fac) { super(); this .fac = fac; } private ClothFac fac; public ProxyClothFac() { } @Override public void produceCloth() { System. out .println( "代理工厂开始" ); this .fac.produceCloth(); System. out .println( "代理工厂结束" ); } } //实际工厂 class LiNingFac implements ClothFac { @Override public void produceCloth() { System. out .println( "LiNing工厂生产" ); } } |
参考:https://blog.csdn.net/spade_Kwo/article/details/122293415
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2017-07-06 MySql中循环的使用
2016-07-06 redis安装