posts - 609,  comments - 13,  views - 64万
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

获取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

posted on   邢帅杰  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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安装
点击右上角即可分享
微信分享提示