0
点赞
收藏
分享

微信扫一扫

Java 反射“简单易懂版“ —— 进阶使用(二)

AbrahamW 2022-01-15 阅读 15

1、反射静态方法

public class MyStaticTest {

    public static void main(String[] args)  {
        try {
            Class staticClz = Class.forName("reflectTest.MyStaticTest");
            Method staticMethod = staticClz.getDeclaredMethod("test01",String.class);
            staticMethod.invoke(null, "调用了 静态 方法 test01");
            //打印 - > 通过反射:调用了 静态 方法 test01
        } catch (Exception e) {

        }
    }
    static void test01(String msg){
        System.out.println("通过反射:" + msg);
    }
}

2、反射泛型参数方法

public class TestTm<T>{
    public void test(T t){
        System.out.println("调用泛型方法:" + t);
    }
}

public class TmMedthodTest {
    public static void main(String[] args) {
        Class<TestTm> testTmClass = TestTm.class;
        try {
            Method tm = testTmClass.getDeclaredMethod("test", Object.class);
            tm.setAccessible(true);
            tm.invoke(new TestTm<String>(),"当前泛型类型 String");
			// 打印-> 调用泛型方法:当前泛型类型 String
        } catch (Exception e) {
        }
    }
}

Proxy 动态代理机制

整个代理机制有三个角色

1、共同接口 (看做 “老板” 约定要做的事,具体怎么做不管)

/**
 *  共同接口 
 */
public interface Subject {
    public void doSomething(String s);
}

2、具体实现类 (看做"技术工人" - 具体干活的人)

/**
 * 具体实现类 
 */
public class RealSubject implements Subject{
    @Override
    public void doSomething(String s) {
        System.out.println("RealSubject 具体执行的操作:" + s);
    }
}

3、代理控制 (看做"中介" - 工人从他手里拿活,干完了还得交给他)

/**
 *  代理控制 
 */
public class ProxyHandler implements InvocationHandler {

    private Object realSubject;

    public ProxyHandler(Object realSubject) {
        this.realSubject = realSubject;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在传入调用目标对象之前,可以执行一些功能 处理
        // 具体目标对象的方法
        System.out.println("干活前:RealSubject 干好了有奖励");

        if (method.getName().equals("goHome")){
            return null; // 想回家不可能的 哈哈!
        }
        Object result = method.invoke(realSubject, args);
        // 在传入调用目标对象之后,可以执行一些功能 处理
        System.out.println("干活后:RealSubject 干这活得不错 多给200块钱");
        return result;
    }
}

具体执行

public class DynamicProxy {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Subject subject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),new Class[]{Subject.class},new ProxyHandler(realSubject));
        subject.doSomething("不停搬砖");
        subject.goHome();
    }
}
可见动态代理可以帮我们做很多事情

例如:添加统一处理;禁止某个 “具体执行类” 执行 某个方法等,
也就是说等有这样的需求变更时,不用每个“具体实现类” 都改一遍,我们就只需要关心 ProxyHandler 这个类就好了,省心省力(发量有保障了 美哉~)!

举报

相关推荐

0 条评论