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 这个类就好了,省心省力(发量有保障了 美哉~)!